android edittext OnChange listener
Wiem trochę o TextWatcher
ale to działa na każdą postać, w którą wejdziesz. Chcę mieć słuchacza, który odpala się, gdy użytkownik zakończy edycję. Czy to możliwe? Również w TextWatcher
otrzymuję instancję Editable
, ale potrzebuję instancji EditText
. Jak to zdobyć?
edytuj: drugie pytanie jest ważniejsze. Proszę, odpowiedz.
7 answers
Po pierwsze, możesz zobaczyć, czy użytkownik zakończył edycję tekstu, jeśli EditText
straci fokus lub jeśli użytkownik naciśnie przycisk Gotowe (zależy to od twojej implementacji i od tego, co pasuje najlepiej dla Ciebie).
Po drugie, nie można uzyskać instancji EditText
wewnątrz TextWatcher
tylko wtedy, gdy zadeklarowano EditText
jako obiekt instancji. Chociaż nie powinieneś edytować EditText
W TextWatcher
, ponieważ nie jest to bezpieczne.
EDIT:
Aby móc pobrać instancję EditText
do twojego TextWatcher
implementacja, powinieneś spróbować czegoś takiego:
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) {}
});
}
}
Zauważ, że powyższa próbka może mieć pewne błędy, ale chciałem tylko pokazać przykład.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-10 05:33:46
Każdy, kto używa ButterKnife . Możesz użyć jak:
@OnTextChanged(R.id.zip_code)
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) {
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-17 17:05:01
Martwiło mnie to, że implementacja listenera dla wszystkich moich pól EditText wymagała ode mnie brzydkiego, wyrazistego kodu, więc napisałem poniższą klasę. Może się przydać każdemu, kto się na to natknie.
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);
}
Teraz implementacja słuchacza jest trochę czystsza.
editText.addTextChangedListener(new TextChangedListener<EditText>(editText) {
@Override
public void onTextChanged(EditText target, Editable s) {
//Do stuff
}
});
Jeśli chodzi o to, jak często się odpala, można by zaimplementować sprawdzanie, aby uruchomić żądany kod w //Do stuff
po danym a
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-21 19:05:54
Zrobiłem to używając 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());
}
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-14 15:40:41
TextWatcher
nie zadziałało na mnie, ponieważ strzelało do każdego EditText
i psowało sobie nawzajem wartości.
Oto moje rozwiązanie:
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();
}
}
Stąd za pomocą metody getChildAt(xx)
można pobrać dowolny element w ListView
i uzyskać pojedynczy element za pomocą findViewById
. A następnie poda najnowszą wartość.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-05 16:24:22
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);
}
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-19 03:17:37
Jeśli o tym myślę, są tylko dwa sposoby, żeby to zrobić. Skąd możesz wiedzieć, że użytkownik skończył pisać słowo? Albo po utracie ostrości, albo kliknięciu przycisku "ok". Nie ma mowy, żebyś wiedział, że użytkownik nacisnął ostatni znak...
Więc zadzwoń onFocusChange(View v, boolean hasFocus)
lub Dodaj przycisk i kliknij do niego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-21 08:21:48