Pregunta

Tengo un cuadro de diálogo con un EditText y un botón. Este EditText nombrará a la tabla de base de datos voy a crear lo que su de la mayor importancia que se valida. Así que me gustaría plantear preguntas 2:

1) Esto es bastante simple, pero no pude aleta en cualquier lugar: ¿qué caracteres puede un nombre de tabla de base de datos de aceptar? ¿Puede aceptar los números? Y puede ser un número del primer carácter?

2) Me las he arreglado para validar el uso de EditText TextWtacher. Aquí está el código:

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

En la actualidad, si el usuario inserta cualquier carácter distinto de las letras minúsculas y números, el cuadro de texto se borra. Si s.insert(0, filtered_str); uncomment con el fin de reemplazar el EditarTexto con la cadena de filtración, mis bloqueos de aplicaciones. Y supongo que lo que encuentro en la depuración?

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

La pregunta es ... ¿cómo puedo reemplazar el texto s?

-.> s.replace(0, s.toString().length(), filtered_str); (quitar s.clear, por supuesto) no parece que el trabajo sea

¿Fue útil?

Solución 2

Después de algún headbanging, finalmente encontró la solución. Parece s.append (filtered_str) después de las obras s.clear (). No sé por qué no tiene trabajo antes.

Otros consejos

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! Estoy tratando cosa similar con forzar el texto de entrada para estar en minúsculas; s.clear () seguido de s.append () causa una StackOverflow para mí también (o todavía).

extrañar por eso nos pone Android a través de' aros de conversión a la fuerza a minúsculas?

Dado que el uso TextWatcher estaba fallando para mí (con toda la razón ... y no pude averiguar cómo extiende por el trabajo), miré a TransformationMethod.

1er intento era hacer un TransformationMethod en línea en el EditarTexto con algo como esto:

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

Este accidente causado debido a IndexArrayOutOfBounds Tan pronto como he escrito un solo caracter en la ET ... no podía entender por qué.

Por lo tanto, he comprobado el código para PasswordTransformation y luego ReplacementTransformation -??. Ambos parecen muy complicado y yo no quería molestarse con todas esas cosas

A continuación, en la subclase desprotegido SinglelineTransformation que era sencillo ... así que creé LowerCaseTransformation como subclase de ReplacementTransformation de la siguiente manera:

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

}

y añadiendo esta xform a et ... como en et.setTransformationMethod (LowerCaseReplacement.getInstnace ()) ...

Esto funciona !!

Si alguien tiene una mejor solución, por favor ilumine!

El problema es que cuando se llama al método de inserción, el método de texto modificado se llama de nuevo. El resultado es un círculo vicioso, por lo tanto el desbordamiento de pila. Esto se puede evitar al no reemplazar una cadena que tiene el formato correcto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top