更改文本后我的屏幕冻结

时间:2012-12-20 01:07:16

标签: java android

我尝试使用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) 
        {                   
        } 
    });

3 个答案:

答案 0 :(得分:2)

email.setText("invalid email");

以上一行应为:

error.setText("invalid email");

使用setText(),您再次触发afterTextChanged()

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

来自TextWatcher.afterTextChanged()的安卓文档:

  

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

确保您不打算拨打error.setText()而不是email.setText()