Domanda

Ho un dialogo con una EditText e un pulsante. Questo EditText nominerà la tabella del database creerò così la sua della massima importanza che viene convalidato. Quindi, vorrei porre 2 domande:

1) Questo è abbastanza semplice, ma non ho potuto fin da nessuna parte: Quali sono i caratteri un nome di tabella di database accettare? Può accettare numeri? E può essere un numero il primo carattere?

2) sono riuscito a convalidare il EditText utilizzando TextWtacher. Ecco il codice:

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

Al momento, se l'utente inserisce qualsiasi carattere diverso da lettere minuscole e numeri, la casella di testo viene cancellato. Se io s.insert(0, filtered_str); uncomment al fine di sostituire l'EditText con la stringa filtrato, i miei si blocca app. E indovinate un po 'che trovo nel debug?

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

La domanda è ... come posso sostituire il testo s?

-.> s.replace(0, s.toString().length(), filtered_str); (remove s.clear, ovviamente) non sembra funzionare sia

È stato utile?

Soluzione 2

Dopo un po 'headbanging, ho finalmente trovato la soluzione. Sembra s.append (filtered_str) dopo s.clear opere (). Non so perché non ha lavoro prima.

Altri suggerimenti

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! sto provando cosa simile con costringendo il testo di input per essere tutto minuscolo; s.clear () seguito da s.append () provoca uno StackOverflow anche per me (o ancora).

stupirsi perché ci mette Android thru' cerchi di conversione forza in minuscolo?

Dato che l'utilizzo TextWatcher stava arrestando per me (giustamente ... e non riusciva a capire come lavorare campate), ho guardato TransformationMethod.

1 ° tentativo è stato quello di fare un TransformationMethod in linea sulla EditText con qualcosa di simile:

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

Questo incidente causato a causa di IndexArrayOutOfBounds appena ho digitato un singolo carattere nel ET ... non riusciva a capire il perché.

Così, ho controllato il codice per PasswordTransformation e poi ReplacementTransformation -??. Entrambi sembrano molto complicato e non volevo perdere tempo con tutta quella roba

Poi nel estratto sottoclasse SinglelineTransformation che era semplice ... così ho creato LowerCaseTransformation come sottoclasse di ReplacementTransformation come segue:

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

}

e l'aggiunta di questo xform di et ... come in et.setTransformationMethod (LowerCaseReplacement.getInstnace ()) ...

Questo funziona !!

Se qualcuno ha una soluzione migliore, quindi si prega di illuminare!

Il problema è che quando si chiama il metodo di inserimento, il metodo di testo modificato viene chiamato di nuovo. Il risultato è un circolo vizioso, in tal modo l'overflow dello stack. È possibile evitare questo non sostituire una stringa che viene formattata correttamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top