EditText не обновляется после изменения текста в TextWatcher - PullRequest
4 голосов
/ 15 сентября 2011

У меня есть 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, не синхронизируется с редактируемым.Когда я отладил код, я увидел, что переменная text (Editable) имеет ожидаемое значение, но то, что показано в EditText, не всегда соответствует Editable.

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

Хотя в большинстве случаев они имеют одинаковое значение.

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

1 Ответ

5 голосов
/ 15 сентября 2011

Хорошо, вы никогда не меняете EditText, а только Editable. Android EditTexts не являются детьми класса Editable. Строки являются подклассами класса Editable. 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;
}

Примечание: я не проверял это

...