动态修改EditText的inputType后如何重新启用输入建议?
兄弟,我看了你的代码和遇到的问题,核心症结其实很明确:你在动态切换inputType的时候,只设置了大小写相关的修饰flag,却漏掉了基础文本输入类型和启用输入建议的关键flag——直接用InputType.TYPE_TEXT_FLAG_CAP_SENTENCES这类单独的flag,会覆盖掉EditText默认的文本输入配置,导致系统自动关闭了输入建议功能。
咱们先理清楚:InputType.TYPE_TEXT_FLAG_CAP_SENTENCES和InputType.TYPE_TEXT_FLAG_CAP_WORDS只是修饰性的flag,必须和基础的InputType.TYPE_CLASS_TEXT(表示这是普通文本输入)结合使用,再加上InputType.TYPE_TEXT_FLAG_AUTO_CORRECT或者InputType.TYPE_TEXT_VARIATION_NORMAL(后者默认包含输入建议的支持),才能同时保留大小写控制和输入建议。
针对你的代码,我给你修改一下关键的inputType设置部分:
override fun afterTextChanged(s: Editable?) { val curStart = edText.selectionStart val len = listMarkers.first().length if (curStart >= len) { val allText = edText.text.toString() val marker = allText.slice(curStart - len until curStart) edText.inputType = if (listMarkers.contains(marker)) { // 单词首字母大写 + 启用输入建议 InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_WORDS or InputType.TYPE_TEXT_FLAG_AUTO_CORRECT } else { // 句首大写 + 启用输入建议 InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or InputType.TYPE_TEXT_FLAG_AUTO_CORRECT } // 保留你原来的其他配置 edText.isSingleLine = false edText.imeOptions = EditorInfo.IME_ACTION_NONE edText.setSelection(curStart) } }
另外,你之前尝试的val type = edText.inputType; edText.inputType = type报错,大概率是因为在afterTextChanged回调里,EditText正处于文本更新的状态中,直接重复设置inputType会触发内部状态冲突,这个思路本身就没必要,只要咱们把inputType的flag组合对就好。
还有个小提醒:如果你的EditText在XML布局里原本就设置了inputType="textNoSuggestions"之类的属性,那得先把它去掉,不然代码里的flag可能会被覆盖。
试试上面的修改,应该就能同时实现你的大小写切换需求,又能保留输入建议了!
备注:内容来源于stack exchange,提问作者Feuer und Wasser

