Использование слушателя TextWatcher для отображения отредактированного текста

Я новичок в разработке Android (я учусь на курсах), так что потерпите меня.

Мне нужно использовать TextWatcher для отображения отредактированного текста из виджета EditText в виджет TextView.

Например, если то, что было первоначально введено, редактируется (например, если пользователь набрал «Hoozledoofer», а затем выделил «zledoof» и, наконец, набрал вместо него «v»), мне пришлось бы сначала вывести изменение в формате:

'zledoof' => 'v'

Это показано в первой строке TextView. Затем во второй строке будет показан полный текст, присутствующий в виджете EditText:

Hoover

Я не знаю, как это сделать. Я знаю, что мне нужно вывести результаты в методе afterTextChanged. Как сохранить то, что было сделано, и по-прежнему выводить все, что набирается? Любой совет?

Ниже приведен пример TextWatcher, приведенный в классе:

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

    txtEdit = (EditText) findViewById(R.id.editText1);
    viewText = (TextView) findViewById(R.id.text);

     txtEdit.addTextChangedListener (new TextWatcher() {

          public void beforeTextChanged(CharSequence s, int start, int count, int after) {
              Log.i("TC", "beforeTC " + s.toString() + " "
                      + s.subSequence(start, start + count).toString());
          }

          public void onTextChanged(CharSequence s, int start, int before, int count) {
              Log.i("TC", "onTC " + s.toString() + " "
                      + s.subSequence(start, start + count).toString());
          }

          public void afterTextChanged(Editable s) {
              Log.i("TC", "afterTC " + s.toString());
          }
     });
}

Вот то, что я пробовал, что дает предполагаемый окончательный результат, но он продолжает показывать каждую маленькую сделанную правку. Это может не быть проблемой и может работать для профессора:

     txtEdit.addTextChangedListener (new TextWatcher() {

         String changed, newStr, edit;

          public void beforeTextChanged(CharSequence s, int start, int count, int after) {
              changed = s.subSequence(start, start + count).toString();

              //Log.i("TC", "beforeTC " + s.toString() + " "
                      //+ s.subSequence(start, start + count).toString());
          }

          public void onTextChanged(CharSequence s, int start, int before, int count) {
              newStr = s.toString();
              edit = s.subSequence(start, start + count).toString();

              //Log.i("TC", "onTC " + s.toString() + " "
                      //+ s.subSequence(start, start + count).toString());
          }

          public void afterTextChanged(Editable s) {
              viewText.setText(changed + " => " + edit + "\n" + newStr);

              //Log.i("TC", "afterTC " + s.toString());

          }
     });

person The Rationalist    schedule 19.02.2013    source источник
comment
Это отличный пример, который дал вам ваш учитель! С его помощью вы можете видеть каждое изменение игры в вашем LogCat. Мне кажется, если вы поиграетесь с EditText (введите случайные символы, переместите курсор, удалите что-то), вы узнаете, как работают три метода, намного лучше и быстрее, чем кто-либо мог бы это объяснить...   -  person Sam    schedule 19.02.2013
comment
Спасибо! Однако я не совсем уверен, как получить доступ к LogCat, чтобы увидеть эти изменения.   -  person The Rationalist    schedule 19.02.2013
comment
Я вижу, это будет проблемой. :) Вы используете Eclipse? Перейдите к Window > Show View > Other..., затем Android > LogCat (очевидно, не используйте устаревшую версию.)   -  person Sam    schedule 19.02.2013
comment
Спасибо @Сэм. Ваше направление действительно помогло. Я думаю, что я получаю это сейчас после просмотра в журнале.   -  person The Rationalist    schedule 19.02.2013


Ответы (2)


Поскольку это домашнее задание, я не буду давать вам ответ. (Ваш учитель сделал большую часть рутинной работы, подав вам хороший пример для начала.) Но я дам вам подсказку:

Например, если то, что было первоначально введено, редактируется (например, если пользователь набрал «Hoozledoofer», а затем выделил «zledoof» и, наконец, набрал вместо него «v»), мне пришлось бы сначала вывести изменение в формате: 'zledoof' => 'v' Это отображается в первой строке TextView.

Обратите внимание на before и after относительно count. Это поможет вам узнать, когда пользователь добавляет или удаляет текст.

Вторая часть проста, и у вас, кажется, уже есть ответ:

Затем во второй строке будет показан полный текст, присутствующий в виджете EditText: Hoover
Я знаю, что мне нужно вывести результаты в методе afterTextChanged.

person Sam    schedule 19.02.2013
comment
Если вам так хочется это увидеть, я разместил свой новый код в нижней части исходного кода. Он дает окончательный результат, как и предполагалось, но он постоянно обновляется при каждом нажатии клавиши. Я не уверен, что это желаемый эффект или нет. Я не думаю, что понял ваш намек на использование до и после относительного количества. Я не могу придумать причину, чтобы использовать их. :( - person The Rationalist; 19.02.2013
comment
Я полагаю, что ваш профессор хочет видеть каждое изменение, поскольку вы заметили, что TextWatcher вызываются много, и если вы не игнорируете ввод, вы не можете ограничить это. (Конечно, я понятия не имею, что это за задание, поэтому, если у вас есть вопросы, было бы лучше задать их учителю.) Похоже, вы нашли решение, не нуждаясь в before или after, поэтому не стесняйтесь игнорировать эту часть моего задания. совет. Ваше решение простое и лаконичное, молодец! (Хм, а какая разница между newStr и s в afterTextChanged()?) - person Sam; 19.02.2013
comment
Спасибо за вашу помощь. И я считаю, что newStr избыточен, и я, вероятно, мог бы покончить с ним. ржу не могу. Я не думал об этом. - person The Rationalist; 19.02.2013

Еще одна вещь, с которой нужно быть очень осторожным, - это не изменять CharSequence в обратных вызовах beforeTextChanged или onTextChanged, а также обратите внимание, что если CharSequence изменяется в обратном вызове afterTextChanged, это вызовет другой вызов серии обратных вызовов (бесконечная рекурсия можно, если не осторожно).

Документ TextWatcher: http://developer.android.com/reference/android/text/TextWatcher.html

РЕДАКТИРОВАТЬ: я не думаю, что вам нужно беспокоиться об этом, думал, что вы изначально писали это в EditText, но теперь я вижу, что вы пишете изменения в TextView, все еще не повредит держать в конце хотя твой разум.

person Brent Hronik    schedule 19.02.2013