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