Android设置numberDecimal|numberSigned的EditText输入负号后无法输入数字
问题原因分析
设置android:inputType="numberDecimal|numberSigned"本身原生支持前导负号+数字的输入组合,出现该问题通常是额外的输入限制逻辑冲突导致,常见诱因如下:
- 自定义样式
@style/editText中配置了android:maxLength="1"或者其他过小的长度限制,输入负号后长度占满无法继续输入 - 代码中为该EditText设置了逻辑错误的
InputFilter或者TextWatcher,比如错误判断了负号后的输入合法性,拦截了后续输入 - 部分定制ROM的原生输入法对numberSigned类型的输入适配存在bug
解决方案
- 检查自定义样式的长度配置
打开styles.xml文件,找到@style/editText配置项,删除其中的android:maxLength限制,或者将值调整为你需要的最大输入长度(例如设置为android:maxLength="10"支持最多10位字符输入)。 - 排查代码中的输入拦截逻辑
检查etAmount相关的业务代码,移除逻辑错误的InputFilter,或者修正TextWatcher的判断规则,示例合法的带符号小数输入过滤逻辑如下:InputFilter decimalFilter = new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { String input = dest.subSequence(0, dstart) + source.toString() + dest.subSequence(dend, dest.length()); // 允许空字符串、单独负号(待输入后续数字)、合法带符号小数 if (input.isEmpty() || input.equals("-") || input.matches("-?\\d*(\\.\\d*)?")) { return null; } return ""; } }; etAmount.setFilters(new InputFilter[]{decimalFilter}); - 适配输入法兼容问题
若排查后无上述配置问题,可显式声明允许输入的字符规避输入法适配问题,在XML中添加如下属性:
也可以在代码中强制指定输入类型:android:digits="0123456789.-"etAmount.setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_NUMBER_FLAG_SIGNED); - 快速定位验证
先临时移除EditText的style="@style/editText"配置,测试输入是否正常,如果恢复正常即可确定是样式配置导致的问题,针对性调整样式即可。
内容的提问来源于stack exchange,提问作者user16083509
相关产品推荐
相关产品推荐

