我想当用户输入电子邮件时,当他们按@时,它会自动将其余部分填充为username@coretec.co.ke
,但问题是它崩溃了
@Override
public void afterTextChanged(Editable s) {
if(email.getText().toString().contains("@")){
String e = email.getText().toString();
email.setText(e+"coretec.co.ke");
}
}
错误logcat:
java.lang.StackOverflowError
at java.lang.System.arraycopy(System.java:216)
at android.text.SpannableStringBuilder.getChars(SpannableStringBuilder.java:926)
at android.text.TextUtils.getChars(TextUtils.java:81)
at android.text.method.ReplacementTransformationMethod$ReplacementCharSequence.getChars(ReplacementTransformationMethod.java:151)
at android.text.TextUtils.getChars(TextUtils.java:81)
at android.text.TextUtils.indexOf(TextUtils.java:114)
at android.text.StaticLayout.generate(StaticLayout.java:191)
at android.text.DynamicLayout.reflow(DynamicLayout.java:288)
at android.text.DynamicLayout.<init>(DynamicLayout.java:174)
at android.widget.TextView.makeSingleLayout(TextView.java:6209)
at android.widget.TextView.makeNewLayout(TextView.java:6107)
at android.widget.TextView.checkForRelayout(TextView.java:6820)
at android.widget.TextView.setText(TextView.java:3850)
at android.widget.TextView.setText(TextView.java:3708)
at android.widget.EditText.setText(EditText.java:81)
at android.widget.TextView.setText(TextView.java:3683)
at com.coretec.coretec.activity.Login$1.afterTextChanged(Login.java:79)
答案 0 :(得分:0)
afterTextChanged
的文档说明,
调用此方法是为了通知您s中的某个文本 已经变了。对s进行进一步更改是合法的 这个回调,但要注意不要让自己陷入无限 循环,因为您所做的任何更改都将导致调用此方法 再次递归
从TextWatcher更新EditText的一种方法是首先从EditText取消注册观察者,将新值设置为EditText,然后再次在EditText中注册观察者以处理进一步的更改。
Here就是一个很好的例子。
答案 1 :(得分:0)
在添加文本之前删除文本更改侦听器,否则它将进入无限循环。像这样更新您的代码:
@Override
public void afterTextChanged(Editable s) {
if(email.getText().toString().contains("@")){
email.removeTextChangedListener(this); // this line
String e = email.getText().toString();
email.setText(e+"coretec.co.ke");
}
}
答案 2 :(得分:-1)
试试这个
String text = email.getText().toString();
if(text.contains("@") && !text.contains("@coretec.co.ke")){
String e = email.getText().toString();
email.setText(e+"coretec.co.ke");
}