Kotlin Android动态创建EditText默认弹出数字键盘问题
你遇到的默认弹数字键盘、isAllCaps配置不生效的核心问题,出在输入类型的配置错误上:InputType.TYPE_TEXT_FLAG_CAP_WORDS 只是一个附加功能标记,不是完整的输入类型定义。所有TYPE_TEXT_FLAG_*开头的常量都必须搭配基础类型InputType.TYPE_CLASS_TEXT组合使用,你单独把这个flag传给setRawInputType,相当于输入类型的基础位为空,系统识别不到这是文本输入框,就会 fallback 到数字小键盘。
替换
SetupInputText函数里错误的输入类型配置
把原来的代码:InputText.setRawInputType(InputType.TYPE_TEXT_FLAG_CAP_WORDS)改成:
// 基础类型指定为普通文本,附加全字符大写标记 InputText.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS这里用
TYPE_TEXT_FLAG_CAP_CHARACTERS比你之前用的CAP_WORDS更适配Wordle的输入场景:前者是强制所有输入字母大写,后者只是单词首字母大写,刚好匹配你要的isAllCaps效果,配置正确后isAllCaps = true也会正常生效。检查自定义的
charactersOnly()扩展逻辑
如果你写的这个扩展函数内部修改了EditText的inputType或者KeyListener,确保不要覆盖上面设置的TYPE_CLASS_TEXT基础类型。如果这个扩展是通过InputFilter实现字符白名单过滤(只允许字母),就不会有冲突。
如果改完配置后部分机型/模拟器还是偶现弹错键盘,可以给EditText加焦点监听,获取焦点时强制唤起字母键盘:
InputText.setOnFocusChangeListener { view, isFocus -> if (isFocus) { view.post { val inputManager = view.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager inputManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT) } } }
注意:不要单独用
setRawInputType传flag值,这个方法会全量覆盖输入类型配置,漏传基础类型必然会导致键盘类型识别异常。
内容的提问来源于stack exchange,提问作者Rhevan

