最近项目,遇到一个需求输入姓名只能是韩文(棒子的app),不能有任何的数字,特殊符号,英文字母。。。
本来以为很简单 查询一下韩文Unicode 范围”\uAC00-\uD7A3”
然后想当然的写一个正则
"^[\uAC00-\uD7A3]+$"
然后写一个Edittext 继承EditText
public class LimitEditText extends EditText {
public LimitEditText(Context context) {
super(context);
}
public LimitEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LimitEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 输入法
* @param outAttrs
* @return
*/
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
return new mInputConnecttion(super.onCreateInputConnection(outAttrs),
false);
}
}
class mInputConnecttion extends InputConnectionWrapper implements InputConnection {
public mInputConnecttion(InputConnection target, boolean mutable) {
super(target, mutable);
}
/**
* 对输入的内容进行拦截
*
* @param text
* @param newCursorPosition
* @return
*/
@Override
public boolean commitText(CharSequence text, int newCursorPosition) {
// 只能输入汉字
if (!text.toString().matches("^[\uAC00-\uD7A3]+$") || text.toString().matches("^[0-9]*$")) {
return false;
}
return super.commitText(text, newCursorPosition);
}
@Override
public boolean sendKeyEvent(KeyEvent event) {
return super.sendKeyEvent(event);
}
@Override
public boolean setSelection(int start, int end) {
return super.setSelection(start, end);
}
}
以为这样就ok了
测试还可以,但是用了一下go输入法 输入一切比较正常
但是如果在英文时候切换阿拉伯数字输入,就能把数字输入到edittext里
debug 发现在英文切数字之后 输入数字根本进入
@Override
public boolean commitText(CharSequence text, int newCursorPosition) {
// 只能输入汉字
if (!text.toString().matches("^[\uAC00-\uD7A3]+$") || text.toString().matches("^[0-9]*$")) {
return false;
}
return super.commitText(text, newCursorPosition);
}
这段方法
无解~~换方式
直接用原生的editText 设置一个Filters
userNameTxt.setFilters(new InputFilter[]{
new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String regex = "^[\uAC00-\uD7A3]+$";
boolean isKr = Pattern.matches(regex, source.toString());
if (!isKr) {
return "";
}
return null;
}
}
});
这样 测试通过 可以过滤所有规则以外的。
如有不对的地方,欢迎大神指正。
完结 撒花~~