Android EditText配置emoji过滤规则后无法支持多行输入问题咨询
问题根因
你遇到的多行输入失效是两个冲突导致的:
android:digits属性与android:inputType="textMultiLine"天然冲突:digits属性本质是系统自动附加DigitsKeyListener过滤规则,该规则会强制禁用换行输入,同时覆盖多行输入的配置- 你定义的
supported_digits允许字符集未包含换行符\n,即使没有属性冲突也无法输入换行
修复方案
第一步:移除XML中的android:digits配置
你已经自定义了InputFilter做字符校验,不需要依赖系统的digits属性,直接删除EditText布局里的这一行即可:
android:digits="@string/supported_digits"
第二步:给允许字符集添加换行符
修改supported_digits字符串,在末尾追加\n:
<string name="supported_digits">!"#$%&'()*+,-./0123456789:;<=>?{|}~[\]^_`@ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz\n</string>
第三步:优化自定义InputFilter避免覆盖系统原有过滤器
你当前的扩展函数直接给filters赋值新数组,会覆盖系统自动添加的maxLength等过滤器,优化后写法如下:
fun EditText.filterEmojisAndDigits(allowedChars: String) { // 保留原有过滤器(比如maxLength),再追加自定义表情过滤规则 val originFilters = filters ?: emptyArray() val emojiFilter = InputFilter { source, _, _, _, _, _ -> source.filter { Character.getType(it) != Character.SURROGATE.toInt() && Character.getType(it) != Character.OTHER_SYMBOL.toInt() && allowedChars.contains(it, false) } } filters = originFilters + emojiFilter }
第四步:代码中调用扩展函数时传入对应的允许字符
在EditText初始化的位置调用扩展函数即可:
val allowedChars = getString(R.string.supported_digits) etAddComment.filterEmojisAndDigits(allowedChars)
以上修改完成后,既可以保留原有的表情、特殊字符过滤能力,也能正常支持多行输入。
内容的提问来源于stack exchange,提问作者Shailendra Madda
相关产品推荐
相关产品推荐

