0

我正在尝试使用 addChangeTextListener,但是当我点击一个键时我的屏幕冻结了。这是代码:

email = (EditText) findViewById(R.id.email);


    email.addTextChangedListener(new TextWatcher() 
    { 
        @Override
        public void afterTextChanged(Editable s) 
        { 
            if (email.getText().toString().matches("[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+") 
                    && s.length() > 0)
                error.setText("valid email");
            else
               email.setText("invalid email");              
        }
        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1,int arg2, int arg3) 
        {   
        }
        @Override
        public void onTextChanged(CharSequence arg0, int arg1,int arg2, int arg3) 
        {                   
        } 
    });
4

3 回答 3

2
email.setText("invalid email");

上面的行应该是:

error.setText("invalid email");

通过使用setText(),您将afterTextChanged()再次触发。

于 2012-12-20T01:10:58.437 回答
1

在更改侦听器中设置文本会导致无限循环,因为它将再次调用更改侦听器。

来自 android 文档TextWatcher.afterTextChanged()

调用此方法是为了通知您,在 s 中的某处,文本已更改。从这个回调中对 s 进行进一步的更改是合法的,但请注意不要让自己陷入无限循环,因为您所做的任何更改都会导致再次递归调用此方法。(您不会被告知更改发生的位置,因为其他 afterTextChanged() 方法可能已经进行了其他更改并使偏移量无效。但是如果您需要在这里知道,您可以在 onTextChanged 中使用 setSpan(Object, int, int, int) (CharSequence, int, int, int) 标记您的位置,然后从此处查找跨度结束的位置。

确保您不是要打电话error.setText()而不是email.setText().

于 2012-12-20T01:11:02.070 回答
1

在你的 else 声明中,你有一个错字。您想在错误时调用 setText,而不是电子邮件。

于 2012-12-20T01:10:55.293 回答