如何在EditText中仅显示支持英文和数字输入且不可切换语言的键盘
实现EditText仅支持英文数字输入的方案
该需求完全可以实现,可通过属性配置加代码拦截的组合方案达成效果:
1. 布局属性基础限制
在布局XML中为EditText添加以下属性,优先限制输入法弹出类型和可输入范围:
<EditText android:id="@+id/limitInputEt" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textVisiblePassword|textNoSuggestions" android:digits="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" />
android:inputType设置为textVisiblePassword可强制绝大多数常规输入法弹出英文键盘,搭配textNoSuggestions关闭输入法联想,避免非英文候选词出现android:digits直接白名单限定所有允许输入的字符,即使用户切换到其他输入法,也无法输入范围外的内容
2. 代码层级强校验拦截
如果需要进一步兜底避免定制系统输入法绕过属性限制,可以添加输入过滤器拦截非法输入:
Java 实现
InputFilter englishNumberFilter = new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { for (int i = start; i < end; i++) { char c = source.charAt(i); boolean isLegal = (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); if (!isLegal) { return ""; } } return null; } }; // 给EditText设置过滤器 editText.setFilters(new InputFilter[]{englishNumberFilter});
Kotlin 实现
val englishNumberFilter = InputFilter { source, start, end, _, _, _ -> for (i in start until end) { val c = source[i] val isLegal = c in '0'..'9' || c in 'a'..'z' || c in 'A'..'Z' if (!isLegal) return@InputFilter "" } null } editText.filters = arrayOf(englishNumberFilter)
补充说明
受第三方输入法实现逻辑限制,无法完全阻止用户切换其他输入语言,但是通过以上两种方案结合,可以保证用户无论使用什么输入法,都无法输入非英文、数字的内容,完全满足业务需求。
内容的提问来源于stack exchange,提问作者Сергей Беляков
相关产品推荐
相关产品推荐

