Wie verwende ich InputFilter, um Zeichen in einem EditText in Android zu begrenzen?

Ich möchte die Zeichen auf 0-9, az, AZ und Leertaste nur beschränken. Einstellungs-Eingangstyp kann ich auf Ziffern beschränken, aber ich kann nicht herausfinden, wie die Inputfilter durch die docs schauen.

  • Java.security.InvalidKeyException: Illegale Schlüsselgröße oder Standardparameter in android
  • Wie integriere ich den Metaio + Open CV für Android-Anwendungen?
  • Ändern Sie den Hintergrund von LinearLayout in Android
  • Wie kann ich telefonisch programmieren?
  • Robolectric 3.0, konnte keine Funktion testen, die ein HandlerThread startet
  • Ein gutes Tutorial für die Verwendung von AccountManager in Android?
  • Elegante Art, Datei in Byte zu lesen Array in Java
  • Telegramm: holen Sie sich vom Telegramm-Client ab
  • So verwenden Sie onSavedInstanceState Beispiel bitte
  • So legen Sie eine Schriftart für das Menü "Optionen" fest?
  • Statistiken über Android-Geräte mit MIPS-Prozessoren
  • Richten Sie die Ansichten des Kindes in der Mitte des ViewPagers android aus
  • 15 Solutions collect form web for “Wie verwende ich InputFilter, um Zeichen in einem EditText in Android zu begrenzen?”

    Ich fand das auf einem anderen Forum. Funktioniert wie ein Champion.

    InputFilter filter = new InputFilter() { public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { for (int i = start; i < end; i++) { if (!Character.isLetterOrDigit(source.charAt(i))) { return ""; } } return null; } }; edit.setFilters(new InputFilter[] { filter }); 

    InputFilters sind ein wenig kompliziert in Android-Versionen, die Wörterbuchvorschläge anzeigen. Manchmal bekommst du einen SpannableStringBuilder, manchmal eine einfache String im Quellparameter.

    Der folgende InputFilter sollte funktionieren. Fühlen Sie sich frei, diesen Code zu verbessern!

     new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { if (source instanceof SpannableStringBuilder) { SpannableStringBuilder sourceAsSpannableBuilder = (SpannableStringBuilder)source; for (int i = end - 1; i >= start; i--) { char currentChar = source.charAt(i); if (!Character.isLetterOrDigit(currentChar) && !Character.isSpaceChar(currentChar)) { sourceAsSpannableBuilder.delete(i, i+1); } } return source; } else { StringBuilder filteredStringBuilder = new StringBuilder(); for (int i = start; i < end; i++) { char currentChar = source.charAt(i); if (Character.isLetterOrDigit(currentChar) || Character.isSpaceChar(currentChar)) { filteredStringBuilder.append(currentChar); } } return filteredStringBuilder.toString(); } } } 

    viel einfacher:

     <EditText android:inputType="text" android:digits="0,1,2,3,4,5,6,7,8,9,*,qwertzuiopasdfghjklyxcvbnm" /> 

    Keine von gebuchten Antworten hat für mich gearbeitet. Ich kam mit meiner eigenen Lösung:

     InputFilter filter = new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { boolean keepOriginal = true; StringBuilder sb = new StringBuilder(end - start); for (int i = start; i < end; i++) { char c = source.charAt(i); if (isCharAllowed(c)) // put your condition here sb.append(c); else keepOriginal = false; } if (keepOriginal) return null; else { if (source instanceof Spanned) { SpannableString sp = new SpannableString(sb); TextUtils.copySpansFrom((Spanned) source, start, sb.length(), null, sp, 0); return sp; } else { return sb; } } } private boolean isCharAllowed(char c) { return Character.isLetterOrDigit(c) || Character.isSpaceChar(c); } } editText.setFilters(new InputFilter[] { filter }); 

    Verwenden Sie diese ihre Arbeit 100% Ihre Notwendigkeit und sehr einfach.

     <EditText android:inputType="textFilter" android:digits="@string/myAlphaNumeric" /> 

    In strings.xml

     <string name="myAlphaNumeric">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789</string> 

    Um Sonderzeichen im Eingabetyp zu vermeiden

     public static InputFilter filter = new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { String blockCharacterSet = "~#^|$%*!@/()-'\":;,?{}=!$^';,?×÷<>{}€£¥₩%~`¤♡♥_|《》¡¿°•○●□■◇◆♧♣▲▼▶◀↑↓←→☆★▪:-);-):-D:-(:'(:O 1234567890"; if (source != null && blockCharacterSet.contains(("" + source))) { return ""; } return null; } }; 

    Sie können den Filter auf Ihren Bearbeitungstext wie unten einstellen

     edtText.setFilters(new InputFilter[] { filter }); 

    Neben der akzeptierten Antwort ist es auch möglich, zB: android:inputType="textCapCharacters" als Attribut von <EditText> zu verwenden, um nur Großbuchstaben (und Zahlen) zu akzeptieren.

    Aus irgendeinem Grund ist der Konstruktor der android.text.LoginFilter-Klasse Paket-scoped, also kannst du es nicht direkt erweitern (obwohl es mit diesem Code identisch wäre). Aber du kannst LoginFilter.UsernameFilterGeneric erweitern! Dann hast du das nur:

     class ABCFilter extends LoginFilter.UsernameFilterGeneric { public UsernameFilter() { super(false); // false prevents not-allowed characters from being appended } @Override public boolean isAllowed(char c) { if ('A' <= c && c <= 'C') return true; if ('a' <= c && c <= 'c') return true; return false; } } 

    Das ist nicht wirklich dokumentiert, aber es ist Teil des Kerns lib, und die Quelle ist einfach . Ich habe es schon seit einiger Zeit benutzt, bisher keine Probleme, obwohl ich zugeben habe, dass ich nicht versucht habe, irgendetwas komplexes mit Spannables zu machen.

    Es ist richtig, der beste Weg, um es zu tun, um es im XML-Layout selbst zu beheben:

     <EditText android:inputType="text" android:digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" /> 

    Wie von Florian Fröhlich richtig gesagt, funktioniert es auch für Textansichten gut.

     <TextView android:inputType="text" android:digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" /> 

    Nur ein Wort der Vorsicht, die Charaktere, die im android:digits werden nur angezeigt, also sei nur vorsichtig, dass du keinen Satz von Charakteren verpasst hast ๐Ÿ™‚

    Diese einfache Lösung hat für mich gearbeitet, als ich den Benutzer daran hindern musste, leere Strings in einen EditText einzugeben. Sie können natürlich noch mehr Zeichen hinzufügen:

     InputFilter textFilter = new InputFilter() { @Override public CharSequence filter(CharSequence c, int arg1, int arg2, Spanned arg3, int arg4, int arg5) { StringBuilder sbText = new StringBuilder(c); String text = sbText.toString(); if (text.contains(" ")) { return ""; } return c; } }; private void setTextFilter(EditText editText) { editText.setFilters(new InputFilter[]{textFilter}); } 

    Wenn Sie InputFilter subclassieren, können Sie Ihren eigenen InputFilter erstellen, der alle nicht alphanumerischen Zeichen herausfiltrieren würde.

    Die InputFilter-Schnittstelle hat eine Methode, filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) , und es bietet Ihnen alle Informationen, die Sie wissen müssen, welche Zeichen in die EditText eingegeben wurden Zugewiesen an.

    Sobald du deinen eigenen InputFilter erstellt hast, kannst du ihn dem EditText zuordnen, indem du setFilters (…) aufrufst.

    http://developer.android.com/reference/android/text/InputFilter.html#filter(java.lang.CharSequence, int, int, android.text.Spanned, int, int)

    Ignorieren der Spanne Zeug, dass andere Menschen behandelt haben, um richtig zu behandeln Wörterbuch Vorschläge Ich fand den folgenden Code funktioniert.

    Die Quelle wächst, wenn der Vorschlag wächst, also müssen wir sehen, wie viele Charaktere es tatsächlich erwartet, dass wir uns ersetzen müssen, bevor wir etwas zurückgeben.

    Wenn wir keine ungültigen Zeichen haben, geben Sie null zurück, so dass der Standardausfall erfolgt.

    Andernfalls müssen wir die gültigen Zeichen aus dem Teilstring heraus extrahieren, der ACTUELL in den EditText gestellt wird.

     InputFilter filter = new InputFilter() { public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { boolean includesInvalidCharacter = false; StringBuilder stringBuilder = new StringBuilder(); int destLength = dend - dstart + 1; int adjustStart = source.length() - destLength; for(int i=start ; i<end ; i++) { char sourceChar = source.charAt(i); if(Character.isLetterOrDigit(sourceChar)) { if(i >= adjustStart) stringBuilder.append(sourceChar); } else includesInvalidCharacter = true; } return includesInvalidCharacter ? stringBuilder : null; } }; 

    Um Worte zu vermeiden. Erstellen Sie eine Klasse, die Sie jederzeit nutzen können.

     public class Wordfilter implements InputFilter { @Override public CharSequence filter(CharSequence source, int start, int end,Spanned dest, int dstart, int dend) { // TODO Auto-generated method stub boolean append = false; String text = source.toString().substring(start, end); StringBuilder str = new StringBuilder(dest.toString()); if(dstart == str.length()) { append = true; str.append(text); } else str.replace(dstart, dend, text); if(str.toString().contains("aaaaaaaaaaaa/*the word here*/aaaaaaaa")) { if(append==true) return ""; else return dest.subSequence(dstart, dend); } return null; } } 

    Es ist möglich, setOnKeyListener zu verwenden. Bei dieser Methode können wir den Eingang edittext !

    Wenn du den Leerraum auch in deine Eingabe aufnehmen möchtest, dann füge Raum in android ein: Zifferncode wie oben gezeigt.

    Es funktioniert gut für mich auch in der Version über Android 4.0.

    genießen ๐Ÿ™‚

    Das Android ist ein Google Android Fan-Website, Alles รผber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.