Chcę ograniczyć znaki tylko do 0-9, az, AZ i spacji. Ustawiając inputtype mogę ograniczyć się do cyfr, ale nie mogę znaleźć sposobów, w jakie Inputfilter przegląda dokumenty.
android
android-edittext
Tim Wayne
źródło
źródło
InputFilter
Są trochę skomplikowane w wersjach Androida, które wyświetlają sugestie ze słownika. Czasami w parametrze pojawia się aSpannableStringBuilder
, czasami zwykły .String
source
Poniższe
InputFilter
powinny działać. Zapraszam do ulepszania tego kodu!źródło
String replacement = source.subSequence(start, end).toString(); return replacement.replaceAll("[^A-Za-z0-9_\\-@]", "");
source instanceof SpannableStringBuilder
wpisanie AB daje mi AAB, tak jak przy próbowaniu poprzedniej odpowiedzi. Na szczęście udało mi się to obejść, korzystając z rozwiązania @florian poniżej.dużo łatwiej:
źródło
","
. Możesz użyć czegoś takiego"0123456789qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJKLYXCVBNM"
imeOptions="actionNext"
itp.Żadna z opublikowanych odpowiedzi nie zadziałała dla mnie. Przyszedłem z własnym rozwiązaniem:
źródło
EditText
może mieć już własne filtry, np. Filtr długości. Dlatego zamiast po prostu zastępować filtry, najprawdopodobniej chcesz dodać filtry do już istniejących.Wykorzystaj to w 100% swojej pracy i bardzo proste.
W strings.xml
źródło
Aby uniknąć znaków specjalnych w typie wprowadzania
Możesz ustawić filtr do tekstu edycji, jak poniżej
źródło
Oprócz zaakceptowanej odpowiedzi możliwe jest również użycie np .:
android:inputType="textCapCharacters"
jako atrybutu<EditText>
w celu akceptowania wyłącznie wielkich liter (i cyfr).źródło
Z jakiegoś powodu konstruktor klasy android.text.LoginFilter jest objęty zakresem pakietu, więc nie można go bezpośrednio rozszerzyć (nawet jeśli byłby identyczny z tym kodem). Ale możesz rozszerzyć LoginFilter.UsernameFilterGeneric! Wtedy po prostu masz to:
Nie jest to tak naprawdę udokumentowane, ale jest częścią podstawowej biblioteki, a źródło jest proste . Używam go już od jakiegoś czasu, do tej pory żadnych problemów, chociaż przyznaję, że nie próbowałem robić nic skomplikowanego z udziałem spannables.
źródło
To prawda, najlepszym sposobem na naprawienie tego w samym układzie XML za pomocą:
jak słusznie zauważył Florian Fröhlich, działa dobrze nawet w przypadku widoków tekstowych.
Tylko słowo ostrzeżenia, znaki wymienione w
android:digits
będą wyświetlane tylko, więc uważaj, aby nie przegapić żadnego zestawu znaków :)źródło
inputType
nie wpływa na filtrowanie.To proste rozwiązanie zadziałało, gdy musiałem uniemożliwić użytkownikowi wprowadzanie pustych ciągów do tekstu edycji. Możesz oczywiście dodać więcej znaków:
źródło
Jeśli utworzysz podklasę InputFilter, możesz utworzyć własny InputFilter, który odfiltrowałby wszelkie znaki inne niż alfanumeryczne.
Interfejs InputFilter ma jedną metodę
filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
i zapewnia wszystkie potrzebne informacje o tym, które znaki zostały wprowadzone do EditText, do którego jest przypisany.Po utworzeniu własnego filtra InputFilter możesz przypisać go do EditText, wywołując setFilters (...).
http://developer.android.com/reference/android/text/InputFilter.html#filter(java.lang.CharSequence , int, int, android.text.Spanned, int, int)
źródło
Ignorując rzeczy z zakresu rozpiętości, z którymi mieli do czynienia inni ludzie, aby poprawnie obsłużyć sugestie ze słownika, stwierdziłem, że następujący kod działa.
Źródło rośnie wraz ze wzrostem sugestii, więc musimy przyjrzeć się, ile znaków faktycznie oczekuje, że zastąpimy, zanim cokolwiek zwrócimy.
Jeśli nie mamy żadnych nieprawidłowych znaków, zwróć wartość null, aby nastąpiła domyślna zamiana.
W przeciwnym razie musimy wyodrębnić prawidłowe znaki z podciągu, który AKTUALNIE zostanie umieszczony w EditText.
źródło
aby zapobiec słowom w edittext. stwórz klasę, której będziesz mógł użyć w dowolnym momencie.
źródło
Najpierw dodaj do
strings.xml
:XML :
Kod w Kotlinie:
Dziwne, ale działa dziwnie na miękkiej klawiaturze emulatora.
Ostrzeżenie! Poniższy kod odfiltruje wszystkie litery i inne symbole z wyjątkiem cyfr w klawiaturach programowych. Na smartfonach pojawi się tylko klawiatura cyfrowa.
Ja też zwykle ustawione
maxLength
,filters
,inputType
.źródło
To stary wątek, ale wszystkie celowe rozwiązania mają problemy (w zależności od urządzenia / wersji Androida / klawiatury).
ODMIENNE PODEJŚCIE
Więc w końcu pojechałem z innego podejścia, zamiast korzystania z
InputFilter
problematyczną wdrażania, używamTextWatcher
iTextChangedListener
zEditText
.PEŁNY KOD (PRZYKŁAD)
Powodem
InputFilter
nie jest dobre rozwiązanie w systemie Android, ponieważ zależy to od implementacji klawiatury. Dane wejściowe z klawiatury są filtrowane przed przekazaniem ich doEditText
. Ale ponieważ niektóre klawiatury mają różne implementacjeInputFilter.filter()
wywołania, jest to problematyczne.Z drugiej strony
TextWatcher
nie dba o implementację klawiatury, pozwala nam stworzyć proste rozwiązanie i mieć pewność, że zadziała na wszystkich urządzeniach.źródło
onTextChanged
prostu potrzebujepublic void
przed sobą.Zrobiłem coś takiego, aby było to proste:
W ten sposób zamieniamy wszystkie niechciane znaki w nowej części ciągu źródłowego na pusty ciąg.
edit_text
Zmienna jestEditText
obiektem mamy na myśli.Kod jest napisany
kotlin
.źródło
Jest możliwe użycie
setOnKeyListener
. W tej metodzie możemy dostosować dane wejścioweedittext
!źródło
W ten sposób utworzyłem filtr dla pola Nazwa w Edytuj tekst (pierwsza litera to WIELKIE LITERY i zezwalaj tylko na jedną spację po każdym słowie.
źródło
Taką samą odpowiedź mam w Kotlinie:
i pobierz klasę z funkcją rozszerzenia:
źródło