TextWatcher не выполняет несколько строк setText

#java #android #android-studio

#java #Android #android-studio

Вопрос:

Используя TextWatcher для изменения букв, кажется, что он выполняет только последнюю строку (например, она изменится c на 3 , но проигнорирует предыдущие изменения. Если я удалю последнюю строку (с по 3), она только тогда начнет меняться b на 2 . Я не уверен, почему это или как это исправить. (Java для меня новая)

 public class MainActivity extends AppCompatActivity {

TextWatcher tt = null;

private TextView textView;
private EditText editText;

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

    final EditText et = (EditText) findViewById(R.id.editText);
    final TextView tv = (TextView) findViewById(R.id.textView);

    tt = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

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

            et.removeTextChangedListener(tt);
            tv.setText(et.getText().toString().replace("a", "1"));
            tv.setText(et.getText().toString().replace("b", "2"));
            tv.setText(et.getText().toString().replace("c", "3"));
            et.addTextChangedListener(tt);


        }

        @Override
        public void afterTextChanged(Editable s) {

                et.setSelection(s.length());

        }
    };
    et.addTextChangedListener(tt);
 

Комментарии:

1. Обзор: добавление некоторого примера может помочь немного больше. В остальном ваш Q выглядит нормально!

Ответ №1:

В предоставленном коде 3 раза setText выполняется для TextView . Таким образом, он сохраняет результат только последнего вызова. Если вы хотите отобразить результат всех замен, сделайте это в одной строке:

 et.removeTextChangedListener(tt);
tv.setText(et.getText().toString().replace("a", "1").replace("b", "2").replace("c", "3"));
et.addTextChangedListener(tt);

 

Редактировать:

Конечно, вы можете выполнить преобразование шаг за шагом:

 et.removeTextChangedListener(tt);
String s = et.getText().toString();
s = s.replace("a", "1");
s = s.replace("b", "2");
s = s.replace("c", "3");
tv.setText(s);
et.addTextChangedListener(tt);
 

Метод String.replace не изменяет строку, но возвращает новую, поэтому нам нужно переназначать результаты каждой замены (я просто назначаю s снова и снова, чтобы предотвратить неиспользуемые ссылки)

Комментарии:

1. Я попробую это сделать. Спасибо за быстрое и простое объяснение. Мне любопытно, хотя, возможно ли это сделать, но сделать его более чистым вместо одной сверхдлинной строки?

2. @Buddhism, просмотрите обновления в asnwer, надеюсь, это поможет