我试图在我的应用程序中对EditText字段设置一些约束。对于全名和其他一些字段,我想只允许字母,空格和其他一些字符,如'。'或' - '。
我在网上看到了一些内容并把它们放在一起:
mFullnameView = (EditText) findViewById(R.id.activity_register_et_fullname);
TextWatcher fullnameTextWatcher = new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
validate(s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//
}
private void validate(String s) {
if (!(Pattern.matches("^[A-Za-z\\s]{1,}[\\.]{0,1}[A-Za-z\\s]{0,}$", s))) {
if (s.length() > 0) {
final String cleanText = s.substring(0, s.length());
mFullnameView.setText(cleanText);
}
}
}
};
然而现在我的应用程序冻结了几秒钟,然后当我尝试输入“。”时崩溃了。在EditText字段中,我不知道为什么会发生这种情况或如何解决它。
答案 0 :(得分:1)
如果更改TextWatcher中的文本,TextWatcher中的方法将再次回调。 因此,您应该避免递归调用或使用InputFilter。
InputFilter[] filters = new InputFilter[1];
filters[0] = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (source == null) return null;
Pattern p = Pattern.compile("^[A-Za-z\\s]{1,}[\\.]{0,1}[A-Za-z\\s]{0,}$");
Matcher m = p.matcher(source.toString());
StringBuilder builder = new StringBuilder();
while (m.find()) {
builder.append(m.group());
}
return builder.toString();
}
};
mFullnameView.setFilters(filters);