3
respostas

TextWatcher como saber se todos os caracteres foram digitados

Boa tarde eu tenho um TextWatcher, que recebe a informação de um leitor bluetooth Bematech BR-200 BT. Só que esse leitor é tem o tipo de leitura como teclado virtual, e o códigos de barra possuem 10 digitos, como eu posso fazer a contagem de caracteres para fazer a limpeza do edit quando for finalizado ?

Segue uma parte do fonte

TextWatcher watcher = new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
                mCrachaLido = txtMatricula.getText().toString();
                if (start == 0){
                    dataInicio = new Date();
                } else if (start > 10){
                    txtMatricula.setText("");                
                    }
        }

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

        }

        @Override
        public void afterTextChanged(Editable s) {
            if (s.length() == 10) {
                txtMatricula.setText(s);    
            }
        }
    };
3 respostas

Oi Ueber, tudo bem?

O parâmetro do count do onTextChanged() tem o objetivo de contar a quantidade de caracteres contidas quando o texto muda dentro do EditText.

Em outras palavras, você pode usá-lo para fazer a verificação, não precisa nem do start ou end.

Você tem dúvida quanto a limpeza do EditText? Se sim, você pode chamar o método getText().clear() do EditText quando a contagem for igual a 10.

[]s

Valeu Alex, só mais uma dúvida. Quando eu sei que ele parou de digitar ? Por exemplo, eu faço a leitura com um leitor de código de barras, e esse código de barras tem 10 caracteres. Mas vamos supor que o usuário, tente ler 2 códigos seguidos. Como farei pra saber onde é o fim de um e o inicio do outro, pra fazer a limpeza ?

Opa Ueber, para esses casos precisa usar técnicas de delay mesmo, usando, por exemplo, um Handler com o postDelayed(), nessa discussão do StackOverFlow, mostra uma resposta com a solução via Handler.

Sim, é meio complexo e chato de implementar, a minha preferida é usando o debounce do RX que também tem um exemplo em uma resposta deste mesmo tópico.

Existem outras respostas, como é o caso de ganho e perda de foco, mas não sei se você quer essa experiência para o usuário final... Uma outra abordagem seria fazer a validação via listener de clique de botão, dessa forma, não precisaria lidar com o watcher de texto.

Sobre os códigos seguidos, ambos vão ficar dentro do mesmo EditText? Se sim, é um problema bem chato de lidar, talvez você vai ter que concatenar um caracter depois do primeiro código para poder separá-los depois, se tiver um exemplo de como ficaria visualmente, talvez eu sabia dar uma alternativa bacana.

[]s