Pergunta

Eu tenho um diálogo com um EditText e um botão. este EditText Nomeará a tabela de banco de dados que eu criarei para que seja a maior importância que ele é validado. Então, eu gostaria de fazer 2 perguntas:

1) Isso é bastante simples, mas eu não consegui prendê -lo em nenhum lugar: quais personagens um nome da tabela de banco de dados pode aceitar? Pode aceitar números? E um número pode ser o primeiro personagem?

2) Eu consegui validar o EditText usando TextWtacher. Aqui está o 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) {}
});

Atualmente, se o usuário inserir qualquer caractere que não seja letras e números minúsculos, a caixa de texto será limpa. Se eu descompor s.insert(0, filtered_str); Para substituir o EditText pela corda filtrada, meu aplicativo está pendurado. E adivinhe o que encontro na depuração?

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

A questão é ... como posso substituir o texto S?

-> s.replace(0, s.toString().length(), filtered_str); (Remova S.Clear, é claro) também não parece funcionar.

Foi útil?

Solução 2

Depois de alguns bate -paus, finalmente encontrei a solução. Parece que o S.Append (filtrado_str) após o S.Clear () funciona. Não sei por que não funcionou antes.

Outras dicas

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

Ei! Estou tentando coisas semelhantes, forçando o texto de entrada a ser minúsculo; s.clear () seguido por s.append () causa um fluxo de pilha para mim também (ou imóvel).

Gostaria de saber por que o Android nos coloca em aros para forçar a conversão em minúsculas?

Como o uso do TextWatcher estava travando para mim (com razão ... e eu não conseguia descobrir como trabalhar em vãos), olhei para o Method de Transformation.

A primeira tentativa foi fazer um modelo de transformação embutido no EdittEXT com algo assim:

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

Isso causou falha devido a indexarrayoutfbounds assim que eu digitei um único char no ET ... não conseguiu descobrir o porquê.

Então, verifiquei o código para obter a formação de senhas e, em seguida, a reposição de transformação - ambos parecem muito complicados e não queria me preocupar com tudo isso?

Em seguida, foi conferido a subclasse SingleLineTransformation, que era simples ... então eu criei o LowerCaseTransformation como subclasse de reposição deformação da seguinte maneira:

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 adicionando este Xform ao ET ... como em et. -SetransformationMethod (LowerCaseReplacement.getInstnace ()) ...

Isso funciona!!

Se alguém tiver uma solução melhor, esclareça!

O problema é que, quando você chama o método de inserção, o método alterado do texto é chamado novamente. Isso resulta em um círculo vicioso, portanto, a pilha transborda. Você pode evitar isso não substituindo uma string que seja formatada corretamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top