6. Lógica da Aplicação
6.6. 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 calculate para refazer os cálculos da aplicação.
private val amountEditTextWatcher = object: TextWatcher {
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
try {
//faz a leitura do valor da caixa de texto e converte em número real (double)
billAmount = s.toString().toDouble() / 100.0
amountTextView?.text = currencyFormat.format(billAmount)
} catch (e: NumberFormatException) {
//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 o programa executar os cálculos
calculate()
}
override fun afterTextChanged(s: Editable?) {}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { }
}