afterTextChanged вылетает

Я пытался реализовать интерфейс Textwatcher, пытаюсь изменить текст в afterTextChanged(), но он вылетает. Почему это вылетает? :

        @Override
        public void afterTextChanged(Editable s) {
            Editable myText;

            if(s.toString().contains("hi")){
                myText = s.append(" ho");
                myEdit.setText(myText);

            }
        }

Logcat

01-27 01:23:18.213: E/AndroidRuntime(2563): FATAL EXCEPTION: main
01-27 01:23:18.213: E/AndroidRuntime(2563): java.lang.StackOverflowError
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.graphics.Paint.getTextRunAdvances(Paint.java:1720)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.MeasuredText.addStyleRun(MeasuredText.java:164)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.MeasuredText.addStyleRun(MeasuredText.java:204)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.StaticLayout.generate(StaticLayout.java:281)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.DynamicLayout.reflow(DynamicLayout.java:284)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.DynamicLayout.access$000(DynamicLayout.java:35)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.DynamicLayout$ChangeWatcher.reflow(DynamicLayout.java:621)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.DynamicLayout$ChangeWatcher.onTextChanged(DynamicLayout.java:631)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:962)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:496)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:247)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:30)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at com.example.textfields.MainActivity$1.afterTextChanged(MainActivity.java:45)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.widget.TextView.sendAfterTextChanged(TextView.java:7108)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:8805)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:970)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:497)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:247)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:30)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at com.example.textfields.MainActivity$1.afterTextChanged(MainActivity.java:45)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.widget.TextView.sendAfterTextChanged(TextView.java:7108)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:8805)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:970)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:497)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:247)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:30)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at com.example.textfields.MainActivity$1.afterTextChanged(MainActivity.java:45)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.widget.TextView.sendAfterTextChanged(TextView.java:7108)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:8805)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:970)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:497)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:247)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:30)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at com.example.textfields.MainActivity$1.afterTextChanged(MainActivity.java:45)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.widget.TextView.sendAfterTextChanged(TextView.java:7108)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:8805)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:970)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:497)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:247)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:30)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at com.example.textfields.MainActivity$1.afterTextChanged(MainActivity.java:45)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.widget.TextView.sendAfterTextChanged(TextView.java:7108)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:8805)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:970)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:497)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:247)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:30)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at com.example.textfields.MainActivity$1.afterTextChanged(MainActivity.java:45)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.widget.TextView.sendAfterTextChanged(TextView.java:7108)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:8805)
01-27 01:23:18.213: E/AndroidRuntime(2563):     at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:970)

person user1944449    schedule 27.01.2013    source источник
comment
что такое myEdit? Где вы это определяете? В чем ошибка?   -  person yildirimyigit    schedule 27.01.2013
comment
@yygyt Я получаю StackOverflow. myEdit - это мой EditText, все определено правильно.   -  person user1944449    schedule 27.01.2013
comment
Можете выложить логи от вылета?   -  person VendettaDroid    schedule 27.01.2013
comment
@ user1944449 StackOverFlowException?   -  person    schedule 27.01.2013
comment
@Glenn StackOverflowError yap   -  person user1944449    schedule 27.01.2013
comment
@VendettaDroid Я отредактировал свой вопрос и вставил в лог   -  person user1944449    schedule 27.01.2013
comment
Да, я это видел. Можно посмотреть на этот stackoverflow.com/questions / 3197708 /   -  person VendettaDroid    schedule 27.01.2013
comment
@ user1944449 вы установили TextWatcher на myEdit?   -  person    schedule 27.01.2013


Ответы (2)


Вы должны вызвать removeTextChangedListener () на вашем EditText, прежде чем устанавливать его текст, и добавить слушателя обратно после изменения текста. В противном случае afterTextChanged() будут продолжать звонить, как вы заметили.

person wsanville    schedule 27.01.2013
comment
Я не устанавливаю текст для редактирования текста. Просто вызовите метод afterTextChanged и передайте текст этому методу. - person Dr.jacky; 13.11.2020

вы также можете попробовать это: -

Это также касается изменения альтернативного значения editText после изменения.

public class MainActivity extends AppCompatActivity 
implements TextWatcher{

   EditText editText1, editText2;
   @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       editText1 = findViewById(R.id.editText1);
       editText2 = findViewById(R.id.editText2);

       editText1.addTextChangedListener(this);
       editText2.addTextChangedListener(this);

      }

    @Override
    public void beforeTextChanged(CharSequence s, int start, 
           int 
           count, int after) {

    }

   @Override
   public void onTextChanged(CharSequence s, int start, int 
           before, int count) {

   }

  @Override
  public void afterTextChanged(Editable s) {

      if (getCurrentFocus() == editText1) {
         // is only executed if the EditText was directly 
            changed by the user.
          Log.e("check","getCurrentFocus() == editText1");

          editText2.removeTextChangedListener(this);

          editText2.setText(String.valueOf(s));

          editText2.addTextChangedListener(this);

       //            editText1.clearFocus();
      }

      if (getCurrentFocus() == editText2) {
          // is only executed if the EditText was directly 
             changed by the user
          Log.e("check","getCurrentFocus() == editText2");

          editText1.removeTextChangedListener(this);

          editText1.setText(String.valueOf(s));

          editText1.addTextChangedListener(this);

        //            editText2.clearFocus();
        }


   }

}
person Nathani Software    schedule 14.08.2019