Frage

Ich habe einen Dialog mit einem EditText und einem Knopf. Diese EditText wird die Datenbanktabelle nenne ich so seine von größter Bedeutung, schaffen es überprüft wird. Also ich möchte 2 Fragen stellen:

1) Das ist ganz einfach, aber ich konnte nicht fin überall es: Welche Zeichen können eine Datenbanktabelle Namen annehmen? Kann es Zahlen akzeptieren? Und kann eine Zahl sein das erste Zeichen?

2) Ich habe es geschafft, die EditText mit TextWtacher zu validieren. Hier ist der Code:

et_name.addTextChangedListener(new TextWatcher() {

public void afterTextChanged(Editable s) {

    String filtered_str = s.toString();

        if (filtered_str.matches(".*[^a-z^0-9].*")) {

        filtered_str = filtered_str.replaceAll("[^a-z^0-9]", "");

        s.clear();

        // s.insert(0, filtered_str);

        Toast.makeText(context,
            "Only lowercase letters and numbers are allowed!",
            Toast.LENGTH_SHORT).show();

    }

}

    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

    public void onTextChanged(CharSequence s, int start, int before, int count) {}
});

Zur Zeit, wenn der Benutzer eine beliebige andere Zeichen als Kleinbuchstaben und Zahlen einfügt, wird das Textfeld gelöscht. Wenn ich uncomment s.insert(0, filtered_str); um die EditText mit dem gefilterten Zeichenkette, meine app hängt zu ersetzen. Und raten Sie mal, was ich im Debug finden?

ERROR / Android Runtime (2454): java.lang.StackOverflowError = D

Die Frage ist ... wie kann ich den s Text ersetzen?

-.> s.replace(0, s.toString().length(), filtered_str); (remove s.clear, natürlich) scheint nicht zu arbeiten entweder

War es hilfreich?

Lösung 2

Nach einigem Headbanging, fand ich schließlich die Lösung. Scheint s.append (filtered_str) nach s.clear () funktioniert. Keine Ahnung, warum es nicht Arbeit vor.

Andere Tipps

private TextWatcher listenerTextChangedFiltro = new TextWatcher() {
        public void afterTextChanged(Editable editable) {

                final String textoFiltrado = StaticString.filterTextCustom(String.valueOf(editable.toString().toLowerCase()));
                if (!textoFiltrado.equals(editable.toString().toLowerCase())) {
                    editable.clear();
                    editable.append(textoFiltrado);
                }
         }
};

hey! Ich versuche, etwas Ähnliches mit dem Eingabetext zwingt alles Klein zu sein; s.clear (), gefolgt von s.append () führt zu einer Stackoverflow für mich auch (oder noch).

Wunder, warum Android bringt uns durch‘Reifen zu zwingen Umwandlung in Kleinbuchstaben?

Da die Verwendung TextWatcher wurde für mich Absturz (zu Recht so ... und ich kann nicht herausfinden, wie Spannweiten arbeiten), sah ich TransformationMethod.

1. Versuch war ein Inline-TransformationMethod auf dem EditText mit so etwas wie dies zu tun:

et.setTransformationMethod(new TransformationMethod() {

        public void onFocusChanged(View view, CharSequence sourceText, boolean focused, int direction,
                Rect previouslyFocusedRect) {
        }

        public CharSequence getTransformation(CharSequence source, View view) {
            String ret = source.toString().toLowerCase();
            System.out.println(ret);
            return ret;
        }
    });

Dies verursachte Absturz aufgrund IndexArrayOutOfBounds, sobald ich ein einzelnes Zeichen in der ET getippt ... konnte nicht herausfinden, warum.

Also, ich überprüfte den Code für PasswordTransformation und dann ReplacementTransformation -?. Beide scheinen sehr kompliziert, und ich wollte nicht mit all dem Zeug stören

Dann in die SinglelineTransformation Unterklasse ausgecheckt, die einfach war ... so i LowerCaseTransformation als Unterklasse von ReplacementTransformation wie folgt erstellt:

public class LowerCaseReplacement extends ReplacementTransformationMethod {
private static final char[] ORIG = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
        'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
private static final char[] REPS = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
        'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
private static LowerCaseReplacement singleton;

@Override
protected char[] getOriginal() {
    return ORIG;
}

@Override
protected char[] getReplacement() {
    return REPS;
}

public static LowerCaseReplacement getInstance() {
    if (singleton == null)
        singleton = new LowerCaseReplacement();
    return singleton;
}

}

und das Hinzufügen dieser xform zu et ... wie in et.setTransformationMethod (LowerCaseReplacement.getInstnace ()) ...

Das funktioniert !!

Wenn jemand eine bessere Lösung hat, dann bitte erleuchten!

Das Problem ist, dass, wenn Sie die Insert-Methode aufrufen, wird der Text geändert Methode erneut aufgerufen wird. Dies führt zu einem Teufelskreis, so dass der Stack-Überlauf. Sie können dies vermeiden, indem nicht eine Zeichenfolge ersetzt, die richtig formatiert ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top