Mam trzy EditText
widżety w moim układzie widoku. Czy jest sposób na użycie jednego TextWatcher
dla wszystkich trzech EditTexts
?
android
textwatcher
bie
źródło
źródło
Odpowiedzi:
Właśnie napotkałem ten problem. Rozwiązałem to, tworząc implementację klasy wewnętrznej,
TextWatcher
która przyjmuje View jako argument. Następnie w implementacji metody wystarczy włączyć widok, aby zobaczyć, z któregoEditable
pochodziDeklaracja:
Stosowanie:
źródło
Single TextWatcher for multiple EditTexts
. Są to 3 wystąpienia jednej klasy TextWatcher. Tak więc 3 oddzielne TextWatchery kontrolują 3 EditTexty.Jeśli chcesz używać tylko afterTextChanged porównaj elementy do edycji:
źródło
==
zamiast.equals()
.Implementacja MultiTextWatcher
Stosowanie
źródło
TextView
pochodzi zmiana.Jeśli chcesz użyć porównania onTextChanged
hashCode()
wspomnianego poniżej -Lub
Jeśli chcesz użyć porównania afterTextChanged
Editable
wspomnianego poniżej -źródło
Będzie działać z tym kodem
Następnie dodaj to w oncreate
źródło
Wiem, że to stary problem i jest to dobra decyzja. Napiszę własne, może komuś to pomoże.
Emulowanie klasycznego przykładu, w którym mamy N EditText i chcemy pokazać przycisk, jeśli wszystkie pola są wypełnione. Ten przykład ma sens, zwłaszcza jeśli dalej używamy walidatorów dla każdego z nich.
Zrobiłem przykład w odniesieniu do problemu, ale możesz zrobić dowolny zestaw
MultiEditText.class
Teraz wygląda to bardzo prosto
CustomTextWatcher.class
Dodam układ, żebyś nie tracił czasu
multi_edit_text.xml
źródło
Niech Twoja klasa odziedziczy po Activity i zaimplementuj TextWatcher.
Następnie, dzięki magii polimorfizmu, wystarczy zapisać się na wydarzenia.
To nie powie ci, co zmieniło TextEdit, jednak używając kombinacji tego i odpowiedzi Sky Kelsey , możesz to ładnie załatwić.
źródło
Następnie:
źródło
źródło
To jest moje rozwiązanie dla kotlina. Możesz po prostu użyć równości referencyjnej (===), aby sprawdzić ten sam obiekt i działa idealnie.
źródło
Wiem, że to pytanie jest stare, ale chciałem podzielić się jednym z moich rozwiązań (w Kotlinie). Moje rozwiązanie to ulepszenie odpowiedzi @Shwarz Andrei, moim powodem było to, że chciałeś manipulować większą ilością rzeczy / obiektów.
Zamiast przekazywać oba parametry
list of EditTexts
ia Button
jako parametry, możesz przekazać tylko swojelist of editText
. Następnie w swojej niestandardowej klasie zaimplementowałbyś lambdę taką:Następnie ustawiasz lub podnosisz go wewnątrz
afterTextChanged
źródło
Oto jak to zrobiłem:
Utwórz ArrayList of EditTexts, a następnie użyj pętli for, aby zastosować TextWatcher dla wszystkich EditTexts, jeśli masz jedno zachowanie dla wszystkich editTexts, po prostu zastosuj je tam, jeśli masz określone zachowania dla niektórych konkretnych editTexts, możesz użyć if oświadczenie, aby wybrać i zastosować do poszczególnych editTexts.
Oto mój kod:
Mam nadzieję że to pomoże
źródło
onTextChanged
w EditText. DodanieonFocusChange
dla wielu widżetów jest znacznie prostsze, ponieważ przekazał obiekt nadawcy z wywołaniem metody. Następnie możesz sprawdzić, który obiekt wyzwolił wywołanie i stamtąd je obsłużyć.