如何使用afterTextChange来获取文本并向其中添加更多文本?

时间:2017-01-12 09:30:34

标签: android

我想当用户输入电子邮件时,当他们按@时,它会自动将其余部分填充为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)

3 个答案:

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