Слушатель onchange для android edittext

Я немного знаю о TextWatcher, но это срабатывает при каждом вводе символа. Мне нужен слушатель, который срабатывает всякий раз, когда пользователь заканчивает редактирование. Является ли это возможным? Также в TextWatcher я получаю экземпляр Editable, но мне нужен экземпляр EditText. Как мне это получить?

EDIT: второй вопрос важнее. Пожалуйста, ответьте на это.


person prongs    schedule 21.06.2012    source источник
comment
попробуйте добавить прослушиватель фокуса, когда editText получает фокус, это означает, что пользователь начал его редактировать, а когда editText теряет фокус, это означает, что редактирование завершено   -  person Houcine    schedule 21.06.2012
comment
github.com/henrychuangtw/AutoInsertEditText   -  person HenryChuang    schedule 18.01.2017


Ответы (9)


Во-первых, вы можете увидеть, закончил ли пользователь редактирование текста, если EditText теряет фокус или если пользователь нажимает кнопку «Готово» (это зависит от вашей реализации и от того, что вам подходит лучше всего). Во-вторых, вы не можете получить экземпляр EditText внутри TextWatcher, только если вы объявили EditText как объект экземпляра. Хотя вы не должны редактировать EditText внутри TextWatcher, потому что это небезопасно.

ИЗМЕНИТЬ:

Чтобы получить экземпляр EditText в свою реализацию TextWatcher, вы должны попробовать что-то вроде этого:

public class YourClass extends Activity {

    private EditText yourEditText;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        yourEditText = (EditText) findViewById(R.id.yourEditTextId);

        yourEditText.addTextChangedListener(new TextWatcher() {

            public void afterTextChanged(Editable s) {

                // you can call or do what you want with your EditText here

                // yourEditText... 
            }

            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

            public void onTextChanged(CharSequence s, int start, int before, int count) {}
        });
    }
}

Обратите внимание, что в приведенном выше примере могут быть некоторые ошибки, но я просто хотел показать вам пример.

person Cata    schedule 21.06.2012

Меня беспокоило то, что реализация прослушивателя для всех моих полей EditText требовала от меня уродливого многословного кода, поэтому я написал класс ниже. Может быть полезно для тех, кто наткнулся на это.

public abstract class TextChangedListener<T> implements TextWatcher {
    private T target;

    public TextChangedListener(T target) {
        this.target = target;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

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

    @Override
    public void afterTextChanged(Editable s) {
        this.onTextChanged(target, s);
    }

    public abstract void onTextChanged(T target, Editable s);
}

Теперь реализация слушателя стала немного чище.

editText.addTextChangedListener(new TextChangedListener<EditText>(editText) {
            @Override
            public void onTextChanged(EditText target, Editable s) {
                //Do stuff
            }
        });

Что касается того, как часто он срабатывает, можно было бы реализовать проверку для запуска желаемого кода в //Do stuff после заданного

person RNGuy    schedule 21.09.2016
comment
Это работает очень хорошо для меня, экономит много строк кода! Вы - гений! - person huypham99; 27.07.2020

Любой, кто использует ButterKnife. Вы можете использовать как:

@OnTextChanged(R.id.zip_code)
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) {

}
person Prakash    schedule 17.06.2016

Я сделал это, используя AutotextView:

AutotextView textView = (AutotextView) findViewById(R.id.autotextview);
textView.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
        seq = cs;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) {

    }

    @Override
    public void afterTextChanged(Editable arg0) {
        new SearchTask().execute(seq.toString().trim());
    }

});
person AndroidGeek    schedule 12.05.2014

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

Вот мое решение:

public class ConsultantTSView extends Activity {
    .....

    //Submit is called when I push submit button.
    //I wanted to retrieve all EditText(tsHours) values in my HoursList

    public void submit(View view){

        ListView TSDateListView = (ListView) findViewById(R.id.hoursList);
        String value = ((EditText) TSDateListView.getChildAt(0).findViewById(R.id.tsHours)).getText().toString();
    }
}

Следовательно, используя метод getChildAt(xx), вы можете получить любой элемент в ListView и получить отдельный элемент, используя findViewById. И тогда он даст самое последнее значение.

person user2566490    schedule 11.07.2013

Насколько я могу думать об этом, есть только два способа сделать это. Как узнать, что пользователь закончил писать слово? Либо при потере фокуса, либо при нажатии на кнопку "ОК". Я не думаю, что вы можете узнать, что пользователь нажал последний символ...

Поэтому вызовите onFocusChange(View v, boolean hasFocus) или добавьте к нему кнопку и прослушиватель кликов.

person Nuno Gonçalves    schedule 21.06.2012

Метод Watcher срабатывает при вводе каждого символа. Итак, я построил этот код на основе метода onFocusChange:

public static boolean comS(String s1,String s2){
    if (s1.length()==s2.length()){
        int l=s1.length();
        for (int i=0;i<l;i++){
            if (s1.charAt(i)!=s2.charAt(i))return false;
        }
        return true;
    }
    return false;
}

public void onChange(final EditText EdTe, final Runnable FRun){
    class finalS{String s="";}
    final finalS dat=new finalS();  
    EdTe.setOnFocusChangeListener(new OnFocusChangeListener() {          
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {dat.s=""+EdTe.getText();}
            else if (!comS(dat.s,""+EdTe.getText())){(new Handler()).post(FRun);}       
        }
    });
}

Чтобы использовать его, просто позвоните так:

onChange(YourEditText, new Runnable(){public void run(){
    // V  V    YOUR WORK HERE

    }}
);

Вы можете игнорировать функцию comS, заменив !comS(dat.s,""+EdTe.getText()) на функцию !equal. Однако сама функция equal некоторое время работает некорректно во время выполнения.

Слушатель onChange запомнит старые данные EditText, когда пользователь введет фокус, а затем сравнит новые данные, когда пользователь потеряет фокус или перейдет к другому вводу. Если сравнение старой строки не совпадает с новой строкой, она запускает работу.

Если у вас есть только 1 EditText, вам нужно будет сделать функцию ClearFocus, сделав Ultimate Secret Transparent Micro EditText ???? за пределами окон ???? и запросив на него фокус, а затем спрятав клавиатуру с помощью диспетчера методов импорта.

person phnghue    schedule 27.01.2020

В Kotlin Android прослушиватель EditText устанавливается с помощью

   val searchTo : EditText = findViewById(R.id.searchTo)
   searchTo.addTextChangedListener(object : TextWatcher {
    override fun afterTextChanged(s: Editable) {

        // you can call or do what you want with your EditText here

        // yourEditText...
    }

    override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
    override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
})
person Rohith Murali    schedule 09.10.2020

person    schedule
comment
В конце есть один ненужный } - person Howard; 07.07.2017