验证TextChanged上的EditText视图

时间:2017-03-21 00:10:04

标签: android

我试图在我的应用程序中对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字段中,我不知道为什么会发生这种情况或如何解决它。

1 个答案:

答案 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);