полей EditText андроид onChange, после чего слушатель
Я знаю немного о TextWatcher но это срабатывает на каждый символ, который вы вводите. Мне нужен слушатель, который срабатывает всякий раз, когда пользователь заканчивает редактирование. Возможно ли это? Также в TextWatcher Я получаю экземпляр Editable но мне нужен экземпляр EditText. Как мне это получить?
EDIT: второй вопрос более важный. Пожалуйста, ответь.
7 ответов:
во-первых, вы можете увидеть, если пользователь закончил редактирование текста, если
EditTextтеряет фокус или если пользователь нажимает кнопку "Готово" (это зависит от вашей реализации и на то, что подходит лучше для вас). Во-вторых, вы не можете получитьEditTextэкземпляр внутриTextWatcherтолько если вы объявилиEditTextкак экземпляр объекта. Даже если вы не должны редактироватьEditTextвнутриTextWatcherпотому что это не безопасно.EDIT:
чтобы иметь возможность получить элемент
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)или добавить кнопку и нажмите слушателя к нему.
Comments