Livro 2 - Projeto da Mini-Calculadora

7. Adicionado a Lógica da Aplicação

7.6. Implementação da interface TextWatcher

O tratamento de eventos de um EditText dispara três métodos: onTextChanged, beforeTextChanged e afterTextChanged. Para o nosso caso, é necessário implementar apenas o primeiro, o resto fica em branco. Ao se inserir ou apagar um digito na caixa de entrada, o método observa o valor digitado, o converte  para  representação  em  moeda  e  manda  atualizar  a  amountTextView  com  o  novo  valor. Dessa forma, por mais que o usuário insira  apenas números, a TextView faz com que apareça a visualização em formato de moeda.

Contudo, no caso de um valor em branco ou não numérico, a conversão do valor bruto em moeda irá dar errado e disparar uma exceção do tipo NumberFormatException. Assim, é necessário criar um tratamento de exceções (implementado através dos comandos try/catch) para caso aconteça esse erro e o programa não trave. Dessa forma, o método faz a tentativa de conversão normal, e em caso de erro, configura os valores como em branco. Independente do disparo ou não de uma exceção, a última etapa do tratamento de eventos é invocar o método -se o calculate() para refazer os cálculos da aplicação.

private final TextWatcher amountEditTextWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
try{
//faz a leitura do valor da caixa de texto e converte em número real (double)
billAmount = Double.parseDouble(charSequence.toString())/100.0;
amountTextView.setText(currecyFormat.format(billAmount));
}
catch (NumberFormatException e) {
//se a entrada for um valor em branco (o usuário apagou o que digitou por exemplo)
//dispara uma exceção. Então o programa seta o valor da conta como ZERO
billAmount = 0.0;
//reseta a entrada com a mensagem de dica inicial
amountTextView.setText(R.string.enter_amount);
}
//manda (re)calcular os valores
calculate();
}

@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

@Override
public void afterTextChanged(Editable editable) {}
};