Muszę sprawdzić poprawność danych wejściowych formularza w serii EditTexts. Używam OnFocusChangeListeners do wyzwalania walidacji po wpisaniu przez użytkownika do każdego z nich, ale to nie zachowuje się zgodnie z oczekiwaniami dla ostatniego EditText.
Jeśli kliknę przycisk „Gotowe” podczas wpisywania końcowego tekstu edycji, wówczas metoda InputMethod zostanie odłączona, ale technicznie rzecz biorąc, fokus nigdy nie zostanie utracony na EditText (a więc nigdy nie nastąpi walidacja).
Jakie jest najlepsze rozwiązanie?
Czy powinienem monitorować, kiedy InputMethod odłącza się od każdego EditText, a nie kiedy zmienia się fokus? Jeśli tak to jak?
android
android-edittext
Stefan
źródło
źródło
Odpowiedzi:
Dlaczego nie używasz
TextWatcher
?Ponieważ masz kilka
EditText
pudełek do walidacji, myślę, że będą Ci odpowiadać:android.text.TextWatcher
interfejsafterTextChanged(Editable s)
metody w następujący sposóbTo
Editable s
naprawdę nie pomaga w znalezieniu tekstu pola edycji tekstu, który jest zmieniany. Ale możesz bezpośrednio sprawdzić zawartość pól EditText, takich jakw ten sam sposób. Mam nadzieję, że wszystko jest jasne, a jeśli tak, to pomaga! :)
EDYCJA: Aby uzyskać czystsze podejście, zapoznaj się z odpowiedzią Christophera Perry'ego poniżej.
źródło
TextWatcher jest trochę rozwlekły jak na mój gust, więc ułatwiłem coś do przełknięcia:
Po prostu użyj tego w ten sposób:
źródło
EditText
IS-ATextView
addTextChangedListener
po rozwiązaniu pliku edittext z widokuJeśli chcesz mieć ładne wyskakujące okienka walidacji i obrazy, gdy wystąpi błąd, możesz użyć
setError
metodyEditText
klasy, jak tutaj opisujęźródło
passwordConfirmTextField
, ale muszę odwołać się do drugiegopasswordTextField
, aby móc je porównać. Jakieś sugestie?W celu zmniejszenia szczegółowości logiki walidacji stworzyłem bibliotekę dla Androida . Zajmuje się większością codziennych walidacji za pomocą adnotacji i wbudowanych reguł. Istnieją ograniczenia, takie jak
@TextRule
,@NumberRule
,@Required
,@Regex
,@Email
,@IpAddress
,@Password
, itd.,Możesz dodać te adnotacje do odniesień do widżetów interfejsu użytkownika i przeprowadzać weryfikacje. Pozwala również na wykonywanie walidacji asynchronicznie, co jest idealne w sytuacjach, takich jak sprawdzanie unikalnej nazwy użytkownika ze zdalnego serwera.
Na stronie głównej projektu znajduje się przykład użycia adnotacji. Możesz również przeczytać powiązany post na blogu, w którym napisałem przykładowe kody dotyczące pisania niestandardowych reguł walidacji.
Oto prosty przykład ilustrujący użycie biblioteki.
Biblioteka jest rozszerzalna, możesz pisać własne reguły rozszerzając
Rule
klasę.źródło
@Length
adnotacją.To było miłe rozwiązanie z tutaj
źródło
Zaktualizowane podejście - TextInputLayout:
Firma Google niedawno uruchomiła bibliotekę obsługi projektowania i jest jeden komponent o nazwie TextInputLayout, który obsługuje wyświetlanie błędów za pośrednictwem
setErrorEnabled(boolean)
isetError(CharSequence)
.Jak tego użyć?
Krok 1: Zawiń swój EditText za pomocą TextInputLayout:
Krok 2: Sprawdź poprawność danych wejściowych
Utworzyłem przykład w moim repozytorium Github , sprawdź przykład, jeśli chcesz!
źródło
com.google.android.material.textfield.TextInputLayout
(zauważ istotną zmianę). Rozumiem z tej odpowiedzi: stackoverflow.com/a/56753953/900394Napisałem klasę, która rozszerza EditText, która natywnie obsługuje niektóre metody walidacji i jest w rzeczywistości bardzo elastyczna.
Obecne, jak piszę, natywnie obsługiwane przez metody walidacji atrybutów xml to:
Możesz to sprawdzić tutaj
Mam nadzieję, że Ci się spodoba :)
źródło
Uważam, że InputFilter jest bardziej odpowiedni do sprawdzania poprawności danych wejściowych w systemie Android.
Oto prosty przykład: Jak za pomocą InputFilter ograniczyć liczbę znaków w EditText w systemie Android?
Możesz dodać Toast, aby przekazać użytkownikowi opinię o swoich ograniczeniach. Sprawdź również tag android: inputType.
źródło
Musiałem przeprowadzić walidację wewnątrz pola, a nie walidację między polami, aby sprawdzić, czy moje wartości były wartościami zmiennoprzecinkowymi bez znaku w jednym przypadku, a podpisanymi wartościami zmiennoprzecinkowymi w innym. Oto, co wydaje mi się działać:
Zauważ, że nie możesz mieć spacji wewnątrz "numberSigned | numberDecimal". Na przykład: „numberSigned | numberDecimal” nie zadziała. Nie wiem dlaczego.
źródło
Wygląda to naprawdę obiecująco i dokładnie to, co zamówił dla mnie lekarz:
EditText Validator
niestandardowe walidatory plus te wbudowane:
źródło
W pliku main.xml
Możesz umieścić następujący atrybut, aby sprawdzić poprawność tylko znaków alfabetu, które można zaakceptować w edytorze.
Zrób to :
źródło
Możesz uzyskać pożądane zachowanie, słuchając, gdy użytkownik naciska przycisk „Gotowe” na klawiaturze, a także inne wskazówki dotyczące pracy z EditText w moim poście „Sprawdzanie poprawności formularzy Androida - właściwy sposób”
Przykładowy kod:
źródło
do weryfikacji adresu e-mail i hasła
źródło
Utworzyłem tę bibliotekę dla Androida, w której możesz łatwo sprawdzić poprawność projektu materiału EditText wewnątrz i EditTextLayout w następujący sposób:
możesz go użyć w ten sposób:
Następnie możesz sprawdzić, czy jest ważny w następujący sposób:
Aby uzyskać więcej przykładów i dostosowań, sprawdź repozytorium https://github.com/TeleClinic/SmartEditText
źródło