прослушиватель Android edittext onchange

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

редактировать: второй вопрос более важный. Пожалуйста, ответьте, что.

7 ответов


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

EDIT:

чтобы иметь возможность получить the 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) {}
        });
    }
}

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


кто с помощью ButterKnife. Вы можете использовать как:

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

}

меня беспокоило, что реализация слушателя для всех моих полей 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 после того


Я сделал это с помощью 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());
    }

});

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. И тогда он даст самое последнее значение.


 myTextBox.addTextChangedListener(new TextWatcher() {  

    public void afterTextChanged(Editable s) {}  

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

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

    TextView myOutputBox = (TextView) findViewById(R.id.myOutputBox);  
    myOutputBox.setText(s);  

    }  
});  

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

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