Question

J'ai un dialogue avec un EditText et un bouton. Cette EditText nommera la table de base de données, je vais créer ainsi son de la plus haute importance, il est validé. Donc, je voudrais poser 2 questions:

1) Ceci est assez simple, mais je ne pouvais pas fin partout: quels caractères peut un nom de table de base de données accepter? Peut-il accepter les chiffres? Et un certain nombre peut être le premier caractère?

2) J'ai réussi à valider le EditText en utilisant TextWtacher. Voici le 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) {}
});

À l'heure actuelle, si l'utilisateur insère un caractère autre que des lettres minuscules et des chiffres, la zone de texte est effacé. Si je s.insert(0, filtered_str); décommentez afin de remplacer le EditText par la chaîne filtrée, mon application se bloque. Et devinez ce que je trouve dans le débogage?

ERREUR / AndroidRuntime (2454): java.lang.StackOverflowError = D

La question est ... Comment puis-je remplacer le texte s?

-.> s.replace(0, s.toString().length(), filtered_str); (supprimer s.clear, bien sûr) ne semble pas fonctionner soit

Était-ce utile?

La solution 2

Après quelques headbanger, j'ai finalement trouvé la solution. Semble s.append (filtered_str) après les travaux de s.clear (). J'sais pourquoi il n'a pas de travail avant.

Autres conseils

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! J'essaie chose similaire avec force le texte d'entrée à être en minuscules; s.clear () suivi par s.append () provoque une StackOverflow pour moi aussi (ou encore).

demander pourquoi nous met Android thru » cerceaux à la conversion de force en minuscules?

Depuis l'utilisation TextWatcher plantait pour moi (à juste titre ... et je ne pouvais pas comprendre comment travailler envergures), je regardais TransformationMethod.

1er essai était de faire une TransformationMethod en ligne sur le EditText avec quelque chose comme ceci:

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;
        }
    });

Cet accident causé en raison de IndexArrayOutOfBounds dès que je tapais un seul caractère dans l'ET ... ne pouvait pas comprendre pourquoi.

Alors, j'ai vérifié le code PasswordTransformation puis ReplacementTransformation -?. Les deux semblent très compliqué et je ne voulais pas embêter avec tout ce genre de choses

Ensuite, dans la sous-classe vérifié de SinglelineTransformation qui était simple ... donc je créé LowerCaseTransformation comme sous-classe de ReplacementTransformation comme suit:

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;
}

}

et en ajoutant cette xform à et ... comme dans et.setTransformationMethod (LowerCaseReplacement.getInstnace ()) ...

Cela fonctionne !!

Si quelqu'un a une meilleure solution, alors s'il vous plaît éclairer!

Le problème est que lorsque vous appelez la méthode d'insertion, de la méthode modifiée de texte est appelé à nouveau. Il en résulte un cercle vicieux, donc le débordement de la pile. Vous pouvez éviter cela en ne remplaçant pas une chaîne qui est correctement formaté.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top