прослушиватель 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)
или добавьте к нему кнопку и прослушиватель щелчка.