InputFilter auf EditText verursachen Text wiederholen

Ich versuche, einen EditText zu implementieren, der die Eingabe von Capital-Zeichen nur [A-Z0-9] mit Ziffern begrenzt.

Ich begann mit der InputFilter-Methode von irgendeinem Post.But hier bekomme ich ein Problem auf Samsung Galaxy Tab 2 aber nicht in Emulator oder Nexus 4.

  • So ändern Sie die Aktionsleiste Titelfarbe im Code
  • Wie man dynamisch Header in Retrofit (Android)
  • Gibt es eine Schlaf () Funktion für Android NDK?
  • Kann den ViewPager nicht bei der Berührung von TextView (mit android: gravity = "center") scrollen
  • Konnte die Eigenschaft 'processManifest' nicht finden auf com.android.build.gradle.internal.api.ApplicationVariantImpl
  • Wie kann ich eine Funktion in meiner Hauptaktivitätsklasse aus einer benutzerdefinierten Galerieansicht in Android aufrufen?
  • Problem ist wie folgt:

    1. Wenn ich "A" tippe, erscheint der Text als "A" seine gute
    2. Nun, wenn ich "B" tippe, so sollte Text "AB" sein, aber es gibt mir "AAB" das sieht sehr seltsam aus.

    Kurz gesagt, es wiederholt die Zeichen

    Hier ist der Code, den ich mit diesem Code arbeite:

     public class DemoFilter implements InputFilter { public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { if (source.equals("")) { // for backspace return source; } if (source.toString().matches("[a-zA-Z0-9 ]*")) // put your constraints // here { return source.toString().toUpperCase(); } return ""; } } 

    XML-Datei-Code:

     <EditText android:id="@+id/et_licence_plate_1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3" android:hint="0" android:imeOptions="actionNext" android:inputType="textNoSuggestions" android:maxLength="3" android:singleLine="true" android:textSize="18px" > </EditText> 

    Ich bin total auf diesem geklebt, also würde jede Hilfe hier sehr geschätzt werden.

  • Weird "Receiver not registered" Ausnahme
  • Wie man einen Android implementiert: Hintergrund, der sich nicht dehnt?
  • Verwenden Sie Insert oder Replace in ContentProvider
  • Wie lade ich ein PopupWindow oder Dialog aus einem Eingabemethodendienst?
  • Ändern der Aktionsschaltflächen bei einer Benachrichtigung
  • Wie viel Java sollte ich gelernt haben, bevor ich Android-Programmierung ausprobiere?
  • 5 Solutions collect form web for “InputFilter auf EditText verursachen Text wiederholen”

    Das Problem der Charaktere Duplizierung kommt von InputFilter schlechte Umsetzung. Vielmehr null zurückkehren, wenn der Austausch nicht geändert werden soll:

     @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, end, null, sp, 0); return sp; } else { return sb; } } } private boolean isCharAllowed(char c) { return Character.isUpperCase(c) || Character.isDigit(c); } 

    InputFilters können an Editable S angehängt werden, um die Änderungen zu beschränken, die an ihnen vorgenommen werden können. Verweise darauf, dass es auf Änderungen hervorgeht, die statt des ganzen Textes enthalten sind.

    Folgen Sie wie unten erwähnt …

      public class DemoFilter implements InputFilter { public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { if (source.equals("")) { // for backspace return source; } if (source.toString().matches("[a-zA-Z0-9 ]*")) // put your constraints // here { char[] ch = new char[end - start]; TextUtils.getChars(source, start, end, ch, 0); // make the characters uppercase String retChar = new String(ch).toUpperCase(); return retChar; } return ""; } } 

    Ich habe in die gleiche Frage, nach der Festsetzung mit Lösungen hier gepostet gab es noch eine verbleibende Ausgabe mit Tastaturen mit Autovervollständigung. Eine Lösung besteht darin, den inputType als 'visiblePassword' einzustellen, aber das reduziert die Funktionalität nicht wahr?

    Ich konnte die Lösung bei der Rückgabe eines Nicht-Null-Ergebnisses in der filter() -Methode beheben, den Anruf verwenden

     TextUtils.copySpansFrom((Spanned) source, start, newString.length(), null, newString, 0); 

    Dies kopiert die Auto-Complete-Spannweiten in das neue Ergebnis und behebt das seltsame Verhalten der Wiederholung bei der Auswahl von Autovervollständigungsvorschlägen.

    Ich habe viele Bugs in der Android InputFilter gefunden, ich bin nicht sicher, ob diese Bugs sind oder beabsichtigt, so zu sein. Aber definitiv hat es meine Anforderungen nicht erfüllt. Also habe ich mich entschieden, TextWatcher anstelle von InputFilter zu verwenden

     private String newStr = ""; myEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // Do nothing } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { String str = s.toString(); if (str.isEmpty()) { myEditText.append(newStr); newStr = ""; } else if (!str.equals(newStr)) { // Replace the regex as per requirement newStr = str.replaceAll("[^A-Z0-9]", ""); myEditText.setText(""); } } @Override public void afterTextChanged(Editable s) { // Do nothing } }); 

    Der obige Code erlaubt es Benutzern nicht, ein spezielles Symbol in Ihren EditText einzugeben. Es sind nur alphanumerische Zeichen erlaubt.

    Versuche dies:

     class CustomInputFilter implements InputFilter { StringBuilder sb = new StringBuilder(); @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { Log.d(TAG, "filter " + source + " " + start + " " + end + " dest " + dest + " " + dstart + " " + dend); sb.setLength(0); for (int i = start; i < end; i++) { char c = source.charAt(i); if (Character.isUpperCase(c) || Character.isDigit(c) || c == ' ') { sb.append(c); } else if (Character.isLowerCase(c)) { sb.append(Character.toUpperCase(c)); } } return sb; } } 

    Dies ermöglicht auch das Filtern, wenn filter () -Methode mehrere Zeichen gleichzeitig akzeptiert, z. B. eingefügten Text aus einer Zwischenablage

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