Android应用:无需自定义键盘移除系统键盘特殊字符的方法
不用自定义键盘移除系统键盘特殊字符的方案
嘿,这个问题我之前帮不少开发者解决过,不用自定义键盘完全有办法搞定!给你几个实用的方案:
方案1:直接使用android:digits属性(最简单)
这是最省事的方法,直接在你的EditText布局里加上android:digits="0123456789",这样系统键盘会只显示你指定的数字字符,那些不需要的特殊符号(比如负号、小数点)就会被隐藏。修改后的布局代码如下:
<androidx.appcompat.widget.AppCompatEditText android:id="@+id/edt_salary" android:layout_width="match_parent" android:inputType="number" android:digits="0123456789" android:layout_height="wrap_content"/>
提示:如果之后需要允许小数点,只需要把digits改成"0123456789."就行,灵活得很。
方案2:自定义InputFilter过滤输入
如果需要更灵活的控制(比如同时限制输入长度、做实时校验),可以用InputFilter来拦截非数字的输入。在Activity或Fragment里给EditText设置这个过滤器:
// Kotlin示例 val digitFilter = InputFilter { source, start, end, dest, dstart, dend -> val regex = Regex("[0-9]*") if (regex.matches(source)) { null // 允许输入 } else { "" // 过滤掉非数字字符 } } edt_salary.filters = arrayOf(digitFilter)
// Java示例 InputFilter digitFilter = new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { String regex = "[0-9]*"; if (Pattern.matches(regex, source)) { return null; } return ""; } }; edt_salary.setFilters(new InputFilter[]{digitFilter});
这个方法的好处是可以同时叠加其他过滤规则(比如InputFilter.LengthFilter(10)限制最大输入长度),一次性搞定多个需求。
方案3:用TextWatcher实时修正输入
虽然不如前两种高效,但如果需要在输入后给用户一些提示(比如弹窗提醒不能输入非数字),可以用TextWatcher:
// Kotlin示例 edt_salary.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?) { val originalText = s.toString() val filteredText = originalText.replace(Regex("[^0-9]"), "") if (filteredText != originalText) { edt_salary.setText(filteredText) // 把光标移到末尾,避免光标跳回开头的尴尬 edt_salary.setSelection(filteredText.length) } } })
注意:这个方法会有轻微的输入闪烁感,因为是先输入再修正,所以优先推荐前两种方案。
内容的提问来源于stack exchange,提问作者Priyanka Alachiya
相关产品推荐
相关产品推荐

