Mam sytuację, w której są dwa pola. field1
a field2
. Wszystko, co chcę zrobić, to puste field2
po field1
zmianie i odwrotnie. Na koniec tylko jedno pole zawiera treść.
field1 = (EditText)findViewById(R.id.field1);
field2 = (EditText)findViewById(R.id.field2);
field1.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) {
field2.setText("");
}
});
field2.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) {
field1.setText("");
}
});
To działa dobrze, jeśli mogę dołączyć addTextChangedListener
do field1
tylko, ale kiedy robię to dla obu polach aplikacja wywala. Oczywiście, ponieważ próbują się zmieniać w nieskończoność. Gdy field1
zmiany zostaną wyczyszczone, field2
w tym momencie
field2
zostanie zmienione, aby usunąć field1
i tak dalej ...
Czy ktoś może zaproponować jakieś rozwiązanie?
starting waiting blocking gc alloc
tego rodzaju błędy, które mogą nawet prowadzić do awarii i zawieszenia. więc przejdź do wiązania danych, to jest bezpieczne i zalecane przez Google teraz ..Odpowiedzi:
Możesz dodać zaznaczenie, aby wyczyścić tylko wtedy, gdy tekst w polu nie jest pusty (tj. Gdy długość jest różna od 0).
Dokumentacja
TextWatcher
tutaj .Przestrzegaj również konwencji nazewnictwa .
źródło
Wiem, że to stare, ale ktoś może kiedyś się z tym spotkać.
Miałem podobny problem, gdy wywoływałem setText na EditText, a onTextChanged był wywoływany, gdy tego nie chciałem. Moim pierwszym rozwiązaniem było napisanie kodu po wywołaniu setText () w celu cofnięcia szkód wyrządzonych przez nasłuchiwanie. Ale to nie było zbyt eleganckie. Po przeprowadzeniu pewnych badań i testów odkryłem, że użycie getText (). Clear () czyści tekst w podobny sposób jak setText („”), ale ponieważ nie ustawia tekstu, słuchacz nie jest wywoływany, więc rozwiązał mój problem. Zamieniłem wszystkie moje wywołania setText („”) na getText (). Clear () i nie potrzebowałem już bandaży, więc może to również rozwiąże twój problem.
Spróbuj tego:
źródło
Jeśli korzystasz z programowania Kotlin dla Androida, możesz dodać
TextChangedListener()
ten kod:źródło
Trochę za późno na odpowiedź, ale oto rozwiązanie wielokrotnego użytku:
Tak więc, gdy powyższe zostanie użyte, wszelkie
setText()
wywołania zachodzące w TextWatcherze nie spowodują ponownego wywołania TextWatchera:źródło
Napotkałem również ten sam problem i wciąż otrzymuję
stackOverflow
wyjątki, i przychodzę z następującym rozwiązaniem.zadeklarowane początkowo boolean skipOnChange = false;
źródło
Możesz także użyć metody hasFocus ():
Przetestowałem to na studiach, nad którymi pracowałem, aby przekonwertować skale temperatur, gdy użytkownik je wpisał. Działało idealnie i jest o wiele prostsze.
źródło
sprawdź String, zanim ustawisz inny
EditText
na pusty. jeśliField1
jest pusty, to dlaczego trzeba ponownie zmienić na („”)? dzięki czemu możesz sprawdzić rozmiar swojego ciągu za pomocą s.lenght () lub dowolnego innego rozwiązaniainnym sposobem na sprawdzenie długości String jest:
źródło
Napisałem do tego własne rozszerzenie, bardzo dla mnie pomocne. (Kotlin)
Możesz pisać tylko tak:
Moje rozszerzenie:
źródło
w tym kodzie noteid to w zasadzie argumenty wzięte z powrotem, które są wstawiane do wcięcia lub przekazywane przez wcięcie.
kod wadą jest w zasadzie dodatkowy kod, jeśli chcesz lepiej zrozumieć.
nowy kod aktywności o nazwie NoteEditor.java do celów edycji, moja aplikacja jest w zasadzie aplikacją do notatek.
źródło
W Kotlin wystarczy użyć funkcji rozszerzenia KTX : (Używa
TextWatcher
)import
core-KTX
:źródło
Możemy usunąć TextWatcher dla pola tuż przed edycją jego tekstu, a następnie dodać go z powrotem po edycji tekstu.
Zadeklaruj obserwatorów tekstu zarówno dla pola1, jak i pola2 jako osobne zmienne, aby nadać im nazwę: np. Dla pola1
następnie dodaj obserwatora, używając jego nazwy:
field1.addTextChangedListener(Field_1_Watcher)
dla pola 1 ifield2.addTextChangedListener(Field_2_Watcher)
dla pola 2Przed zmianą pole2 tekst usunąć TextWatcher:
field2.removeTextChangedListener(Field_2_Watcher)
zmienić tekst:field2.setText("")
następnie dodaj TextWatcher z powrotem:
field2.addTextChangedListener(Field_2_Watcher)
Zrób to samo dla drugiego pola
źródło
Dodaj dynamicznie tło w
onCreate
metodzie:usuń także tło z XML.
źródło