如何禁止inputType为numberDecimal的EditText首字符为点号?
实现禁止numberDecimal类型EditText首字符为点号的方案
方案1:使用InputFilter(推荐)
InputFilter可以在输入内容提交到EditText前就做拦截,不会出现输入后再删除的闪烁问题,是性能最优的实现方式。
核心逻辑是判断输入后的完整文本,如果首字符为.就直接拦截本次输入:
Kotlin代码示例
val forbidStartDotFilter = InputFilter { source, start, end, dest, dstart, dend -> // 拼接输入后的完整文本 val newText = dest.subSequence(0, dstart).toString() + source.subSequence(start, end) + dest.subSequence(dend, dest.length) // 如果文本非空且首字符为点号,拦截输入返回空 if (newText.isNotEmpty() && newText.first() == '.') { return@InputFilter "" } // 合法输入不拦截 null } // 给EditText设置Filter,如果有其他Filter可以一起传入 editText.filters = arrayOf(forbidStartDotFilter)
Java代码示例
InputFilter forbidStartDotFilter = new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { // 拼接输入后的完整文本 String newText = dest.subSequence(0, dstart).toString() + source.subSequence(start, end) + dest.subSequence(dend, dest.length()); // 如果文本非空且首字符为点号,拦截输入返回空 if (!newText.isEmpty() && newText.charAt(0) == '.') { return ""; } // 合法输入不拦截 return null; } }; // 给EditText设置Filter,如果有其他Filter可以一起传入 editText.setFilters(new InputFilter[]{forbidStartDotFilter});
方案2:使用TextWatcher
如果你的场景已经需要监听输入内容做其他联动逻辑,可以用TextWatcher在输入完成后做校验,把开头的点号直接删掉:
Kotlin代码示例
editText.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} override fun afterTextChanged(s: Editable?) { s?.takeIf { it.isNotEmpty() && it.first() == '.' }?.let { // 移除开头的点号 it.delete(0, 1) } } })
注意事项
- 请确保EditText已经配置了
android:inputType="numberDecimal"属性,限制只能输入数字和小数点,避免其他非法字符输入 - 如果需要同时限制小数位数,只需要在InputFilter的判断逻辑里加对应的小数位校验规则即可,和禁止首字符为点号的逻辑完全兼容
内容的提问来源于stack exchange,提问作者Novikov
相关产品推荐
相关产品推荐

