EditText не обновляется после изменения текста в TextWatcher

У меня есть EditText и TextWatcher.

Скелет моего кода:

EditText x; x.addTextChangedListener(new XyzTextWatcher()); XyzTextWatcher implements TextWatcher() { public synchronized void afterTextChanged(Editable text) { formatText(text); } } 

Мой метод formatText () вставляет некоторые дефисы в некоторых положениях текста.

 private void formatText(Editable text) { removeSeparators(text); if (text.length() >= 3) { text.insert(3, "-"); } if (text.length() >= 7) { text.insert(7, "-"); } } private void removeSeparators(Editable text) { int p = 0; while (p < text.length()) { if (text.charAt(p) == '-') { text.delete(p, p + 1); } else { p++; } } } 

У меня проблема – то, что отображается на моем EditText, не синхронизируется с Editable. Когда я отлаживал код, я увидел, что переменная text (Editable) имеет ожидаемое значение, но то, что показано в EditText, не всегда соответствует Editable.

Например, когда у меня есть текст x = "123-456-789", я вручную вырезал текст «456» из x. После форматирования my Editable имеет значение «123-789-». Однако значение, указанное в моем EditText, равно «123–789»,

В большинстве случаев они имеют одинаковую ценность.

Я предположил, что EditText IS Editable, и они всегда должны совпадать. Я что-то упускаю?

Хорошо, вы никогда не меняете EditText только редактируемым. Android EditTexts не являются дочерними элементами Редактируемого класса. Строки – это подклассы редактируемого класса. OnTextChangedListener не получает EditText в качестве аргумента, но Editable / String отображается в EditText. После того, как вы отформатируете Editable с помощью дефиса, вам необходимо обновить EditText . Что-то вроде этого должно работать нормально:

 class MyClass extends Activity{ //I've ommited the onStart(), onPause(), onStop() etc.. methods EditText x; x.addTextChangedListener(new XyzTextWatcher()); XyzTextWatcher implements TextWatcher() { public synchronized void afterTextChanged(Editable text) { String s = formatText(text); MyClass.this.x.setText(s); } } } 

Чтобы предотвратить замедление, почему бы не изменить метод formatText что-то вроде этого?

 private Editable formatText(Editable text) { int sep1Loc = 3; int sep2Loc = 7; if(text.length==sep1Loc) text.append('-'); if(text.length==sep2Loc) text.append('-'); return text; } 

Примечание. Я не тестировал это

Intereting Posts
Простая система частиц на Android с использованием OpenGL ES 1.0 Android ProgressDialog не работает с мобильной сетью Панель инструментов выравнивает название в центре с помощью кнопки «Назад» Ограничить размер текстового поля горизонтально Android – прямая печать Android-панель поиска Поиск со списком Предотвращение «длительной печати» Android для сохранения изображений Клавиатура перестала работать на эмуляторе Intel x86 Android после обновления до ADT 20 Внедрение и дизайн приложений для Android для телевизора Выполнение не выполнено для задачи ': app: compileDebugNdk' при попытке скомпилировать проект Android Studio с исходным кодом NDK Загружать динамическое количество файлов с okHttp3 Как интегрировать OpenCV Manager в Android-приложение Как установить пользовательский минимальный и максимальный день выбора даты в «wdullaer materialdatetimepicker», NotifyDataSetChanged () не обновляющий адаптер Facebook Graph API: получение случайных друзей N?