最近在项目中,有遇到“让编辑框只能输入汉字”这种需求,然后上网看了一下,解决方法大致是两种,一种是自定义了一个EditText,然后重写commitText方法,实现限制输入汉字的方法,例如:
/** * 对输入的内容进行拦截 * * @param text * @param newCursorPosition * @return */ @Override public boolean commitText(CharSequence text, int newCursorPosition) { // 只能输入汉字 if (!isChinese(text.toString())) { return false; } return super.commitText(text, newCursorPosition); }
另一种是在所有的输入都完成后,检查EditText里面的字符是否都是汉字,这种就不举例了。
其实实现这种需求还有第三种方式,通过使用Android源码中的InputFilter接口可以非常简单的实现这个功能。
InputFilter filter = new InputFilter() { public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { for (int i = start; i < end; i++) { if (!isChinese(source.charAt(i))) { return ""; } } return null; } };
实现接口中的filter方法,然后把它设置到EditText组件上,就可以实现此需求了。
et_chinese.setFilters(new InputFilter[]{filter});然后InputFilter接口中还有个静态类LengthFilter可以实现对编辑框输入字符数量的控制。
//如果想要再实现输入字符数量的限制,可以这么写,如果限制字符数为6,就在LengthFilter中传入参数6 et_chinese.setFilters(new InputFilter[]{filter, new InputFilter.LengthFilter(6)});代码中的isChinese方法来自:点击打开链接
/** * 判定输入汉字 * * @param c * @return */ public static boolean isChinese(char c) { Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) { return true; } return false; }最后放出DEMO位置:点击前往
转载出处:http://blog.csdn.net/lx_asymmetric/article/details/53838165