Наблюдайте за несколькими EditText для изменения текста в Android

Это то, что я собираюсь сделать: у меня есть активность с 20-25 EditText. Когда текст EditText изменяется, некоторый соответствующий текст TextView должен быть изменен. то есть пользователь вводит свои ежемесячные расходы на продукты, поэтому TextView, который показывает его годовые расходы на продукты, обновляется, а также общие ежемесячные и годовые расходы TextView.

Я знаю, что могу сделать это с помощью TextWatcher. Но в этом случае мне понадобится отдельный TextWatcher для каждого из EditText. Даже если я напишу собственный TextWatcher, который содержит идентификатор EditText и выполняет соответствующую операцию в блоке switch-case, но в этом случае мне понадобится новый экземпляр этого класса для каждого EditText. Разве это не очень неэффективно и потребляет много памяти?

Я надеялся получить что-то вроде OnClickListener, чтобы мне нужно было только переопределить некоторые функции, и он будет выполнять все задачи, например, для всех кнопок в моем действии. Мне просто нужно переопределить функцию onClick (View v) и это сделано. Есть ли способ сделать это?


person Mehedi    schedule 24.11.2012    source источник


Ответы (2)


Как насчет такого:

yourEditText1.setOnFocusChangeListener(yourFocusChangeListener);
yourEditText2.setOnFocusChangeListener(yourFocusChangeListener);

View.OnFocusChangeListener yourFocusChageListener = new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus) {
            // Update your textview depending on which edittext lost focus
        }
    }
});

Преимущество этого по сравнению с TextWatcher (IMO) заключается в том, что вы знаете, что пользователь закончил работу, поскольку он ушел от EditText. Единственная проблема заключается в том, что им нужно уйти, чтобы он выстрелил (не уверен, что это будет для вас шоу или нет).

person Barak    schedule 24.11.2012
comment
Это может быть сделано, очевидно, но я хочу, чтобы слушатель срабатывал сразу же, как это делает TextWatcher. Спасибо за комментарий. - person Mehedi; 24.11.2012

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

person user    schedule 24.11.2012
comment
не могли бы вы объяснить, как я могу получить идентификатор EditText, вызвавшего событие? - person Mehedi; 24.11.2012
comment
@Mehedi единственный способ получить этот идентификатор - передать его реализации TextWatcher, как вы уже отметили в своем вопросе. Я отредактировал свой предыдущий пример, чтобы включить идентификатор, вы можете найти его здесь gist.github.com/4140851 . Не беспокойтесь об объеме памяти или проблемах с производительностью, эти экземпляры TextWatcher не будут проблемой. - person user; 24.11.2012
comment
Спасибо за ваш комментарий. Я думаю, у меня нет других вариантов, чтобы попробовать, кроме этого. Я попробую и дам вам знать, как все прошло. - person Mehedi; 25.11.2012