Как изменить текст TextView на DataChange без вызова TextWatcher Listener

TextView textView=new TextView(context); textView.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { s.append("A"); } }); 

Если мы добавим TextWatcher в TextView , и я хочу добавить письмо к этому TextView , каждый раз, когда пользователь будет писать письмо в нем, но это TextWatcher вызов TextWatcher Listener, так что на StackOverFlow error , так как Добавить текст без повторного вызова TextWatcher Listener?

Solutions Collecting From Web of "Как изменить текст TextView на DataChange без вызова TextWatcher Listener"

Документация afterTextChanged говорит:

Этот метод вызван, чтобы уведомить вас, что где-то в s текст был изменен. Допустимо делать дальнейшие изменения s в этом обратном вызове, но будьте осторожны, чтобы не попасть в бесконечный цикл, потому что любые сделанные вами изменения заставят этот метод вызываться снова рекурсивно . (Вам не сообщается, где произошло изменение, потому что другие методы afterTextChanged (), возможно, уже внесли другие изменения и сделали недействительными смещения. Но если вам нужно знать здесь, вы можете использовать setSpan(Object, int, int, int) в onTextChanged(CharSequence, int, int, int) чтобы отметить ваше место, а затем посмотреть отсюда, где закончился диапазон.

Итак, с каждым s.append("A") вы call afterTextChanged() снова и так далее.

Это просто:

 @Override public void afterTextChanged(Editable s) { editText.removeTextChangedListener(this); //Any modifications at this point will not be detected by TextWatcher, //so no more StackOverflowError s.append("A"); editText.addTextChangedListener(this); } 

Другой способ избежать stackoverflow:

 TextView textView=new TextView(context); textView.addTextChangedListener(new TextWatcher() { boolean editing=false; @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count,int after) { } @Override public void afterTextChanged(Editable s) { if (!editing){ editing=true; s.append("A"); editing=false; } } });