предотвращение двойного запуска внутри текстового наблюдателя Android

Я работаю с Android TextWatcher для этого: когда пользователь печатает, сохраняет то, что набрал, и после сохранения изменяет символы внутри Edittext. например, у меня есть постоянный текст, такой как «привет, я счастлив», и все, что я набираю в edittext, пользователь видит, что этот текст пишет (эта строка отображается тандемно во время ввода пользователем)! но основной текст, который вводит пользователь, хранится в переменной . я использую этот код внутри afterTextChanged:

if(s.toString().charAt(s.length()-1) != 'a'){
    //save inside freaktext variable(append)
    freaktext=freaktext+s.toString().charAt(s.length()-1);

        //change edittext value(what user see's)
    txtfreak.setText(s.toString().substring(0, s.length()-1) + "a"); 
    txtfreak.setSelection(txtfreak.getText().length());
}else{
    freaktext=freaktext+"a";
}

В этом коде я говорю, что если введенный символ не является «a», сохраните его в переменной с именем «freaktext», а затем измените значение edittext и поместите символ «a» в конец строки внутри edittext. но если пользователь вводит «а», просто сохраните его в FreakText.

но моя проблема заключается в следующем: когда пользователь не вводит символ "a", все работает нормально, и мой код сохраняет введенный символ, а затем изменяет значение edittext, но когда значение edittext изменяется, весь код запускается снова, и потому что в последний раз я меняю его и помещаю " a" к нему, вторая часть моего кода (еще) запускается и снова сохраняет "a" в конец сохраненной строки. на самом деле, когда я набираю «q», я вижу «qa» в моей сохраненной строке! я хочу, чтобы пользователь прямо вводил «а» на клавиатуре, сохранял «а», а в других ситуациях — нет. на самом деле мой раздел else запускается только тогда, когда пользователь напрямую нажимает клавишу «a» на клавиатуре. как я могу это сделать? пожалуйста, помогите мне, этот код тратит мое время на 1 день


person Fcoder    schedule 28.03.2013    source источник


Ответы (2)


Вне вашей функции, где-то:

boolean weChangedIt = false;

Внутри afterTextChanged:

if (weChangedIt) {
     weChangedIt = false;
} else {
    if(s.toString().charAt(s.length()-1) != 'a'){
        weChangedIt = true;
        freaktext=freaktext+s.toString().charAt(s.length()-1);
        txtfreak.setText(s.toString().substring(0, s.length()-1) + "a"); 
        txtfreak.setSelection(txtfreak.getText().length());
    }else{
        freaktext=freaktext+"a";
    }
}
person Tushar    schedule 28.03.2013
comment
Вот это да!! Спасибо. Я несколько раз пробовал этот метод, но каждый раз у меня возникала проблема, и мой код никогда не был красивым и хорошо отформатированным. но ваш код работает нормально, и я хочу поблагодарить вас, мой друг! :) - person Fcoder; 28.03.2013

person    schedule
comment
+1 Хороший ответ. Кроме того, вы можете просто использовать this вместо whateveryourlistenername. - person Tushar; 28.03.2013
comment
Я не знал, что у него есть для своего слушателя, он мог бы расширить класс TextWatcher - person Hoan Nguyen; 28.03.2013
comment
Если он не передаст Editable другой функции, это будет работать независимо от того, является ли его класс implemented TextWatcher или это был анонимный внутренний класс. - person Tushar; 28.03.2013
comment
Нет, он мог бы иметь открытый класс MyTextWatcher, расширяющий TextWhatcher, а затем MyTextWatcher mTextWatcher = new MyTextWatcher(), а затем addTextChangeListener (mTextWatcher) - person Hoan Nguyen; 28.03.2013
comment
Это все равно будет работать благодаря наследованию/полиморфизму. Попытайся. - person Tushar; 28.03.2013