Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged

121

Sob que circunstâncias devo usar em afterTextChangedvez de onTextChangede vice-versa?

Vai
fonte

Respostas:

199

Esses eventos são chamados na seguinte ordem:

  1. beforeTextChanged (CharSequence s, int start, int count, int after) .
    Isso significa que os caracteres estão prestes a ser substituídos por algum novo texto. O texto não é editável.
    Use: quando você precisar dar uma olhada no texto antigo que está prestes a mudar.

  2. onTextChanged (CharSequence s, int start, int before, int count) .
    Alterações foram feitas, alguns caracteres foram substituídos. O texto não é editável.
    Use: quando você precisar ver quais caracteres no texto são novos.

  3. afterTextChanged (Editável) .
    O mesmo que acima, exceto que agora o texto é editável .
    Use: quando você precisar ver e possivelmente editar o novo texto.

Se estou apenas ouvindo alterações EditText, não precisarei usar os dois primeiros métodos. Apenas receberei novos valores no terceiro método e, se necessário, corrigirei o novo texto. No entanto, se eu tivesse que rastrear as mudanças exatas que acontecem com os valores, usaria os dois primeiros métodos. Se eu também precisasse editar o texto depois de ouvir as alterações, faria isso no terceiro método.

Malcolm
fonte
Ajudou-me a entender por que alterar o texto no onTextChanged estava levando ao ANR.
Sukhvir Singh
12

public void afterTextChanged (Editável)

Este método é chamado para notificá-lo de que, em algum lugar interno s, o texto foi alterado. É legítimo fazer alterações adicionais a spartir desse retorno de chamada, mas tome cuidado para não entrar em um loop infinito, pois qualquer alteração feita fará com que esse método seja chamado novamente recursivamente. (Você não disse onde a mudança ocorreu porque outros afterTextChanged () métodos podem já fizeram outras mudanças e invalidados os deslocamentos. Mas se você precisa saber aqui, você pode usar setSpan(Object, int, int, int)em onTextChanged(CharSequence, int, int, int)para marcar o seu lugar e, em seguida, olhar para cima a partir daqui, onde o período acabou.

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

Esse método é chamado para notificá-lo de que, dentro de s, os countcaracteres começando em startestão prestes a ser substituídos por um novo texto com comprimento after. É um erro tentar fazer alterações snesse retorno de chamada.

public void onTextChanged (CharSequence s, int start, int before, int count)

Esse método é chamado para notificá-lo de que, dentro de s, os countcaracteres iniciados em startacabam de substituir o texto antigo que tinha tamanho before. É um erro tentar fazer alterações snesse retorno de chamada.

Direto da Referência do Android para o TextWatcher .

GregD
fonte
Por que você apenas copiava o código da API? Muitas vezes a API é "ilegível por humanos".
matua 07/07
@matua Esta pergunta / resposta é de mais de 11 anos atrás.
GregD 8/07
em seguida, os comentários devem ser bloqueadas eu acho :)
matua
0

Android Textwatcher é um tipo de gatilho chamado na alteração de texto de um campo de entrada.

afterTextChanged (Editable s)- Este método é chamado quando o texto foi alterado. Como qualquer alteração feita fará com que esse método seja chamado novamente recursivamente, você deve estar atento ao executar operações aqui, caso contrário, isso pode levar a um loop infinito .

onTextChanged (CharSequence s, int start, int before, int count)- Esse método é chamado para notificá-lo de que, dentro de s, os caracteres de contagem iniciados no início substituíram o texto antigo com tamanho anterior. É um erro tentar fazer alterações em s desse retorno de chamada.

IntelliJ Amiya
fonte
6
Copiar / colar a documentação não é útil e não responde à pergunta.
David Wasser