No meu projeto eu tenho um EditText
. Quero contar os caracteres no EditText
e mostrar esse número em um TextView
. Eu escrevi o seguinte código e funciona bem. No entanto, meu problema é que quando clico, Backspaceele conta, mas preciso diminuir o número. Como posso considerar Backspace?
tv = (TextView)findViewById(R.id.charCounts);
textMessage = (EditText)findViewById(R.id.textMessage);
textMessage.addTextChangedListener(new TextWatcher(){
public void afterTextChanged(Editable s) {
i++;
tv.setText(String.valueOf(i) + " / " + String.valueOf(charCounts));
}
public void beforeTextChanged(CharSequence s, int start, int count, int after){}
public void onTextChanged(CharSequence s, int start, int before, int count){}
});
Respostas:
Usar
O seguinte foi sugerido em uma das respostas, mas é muito ineficiente
fonte
Que tal apenas obter o comprimento do caractere no seu EditText e exibi-lo?
algo ao longo da linha de
fonte
textMessage.length()
, sem necessidade de fazergetText().toString()
. developer.android.com/reference/android/widget/...poucas mudanças no seu código:
fonte
Esta é uma resposta um pouco mais geral, com mais explicações para futuros espectadores.
Adicionar um ouvinte alterado de texto
Se você deseja encontrar o tamanho do texto ou fazer outra coisa depois que o texto foi alterado, você pode adicionar um ouvinte alterado no texto de edição.
O ouvinte precisa de um
TextWatcher
, o que requer três métodos para ser substituído:beforeTextChanged
,onTextChanged
, eafterTextChanged
.Contando os caracteres
Você pode obter a contagem de caracteres em
onTextChanged
oubeforeTextChanged
comou
afterTextChanged
comSignificado dos métodos
Os parâmetros são um pouco confusos, então aqui está uma pequena explicação extra.
beforeTextChanged
beforeTextChanged(CharSequence charSequence, int start, int count, int after)
charSequence
: Este é o conteúdo do texto antes da alteração pendente. Você não deve tentar mudar isso.start
: Este é o índice de onde o novo texto será inserido. Se um intervalo for selecionado, é o índice inicial do intervalo.count
: Este é o tamanho do texto selecionado que será substituído. Se nada for selecionado,count
será0
.after
: esse é o tamanho do texto a ser inserido.onTextChanged
onTextChanged(CharSequence charSequence, int start, int before, int count)
charSequence
: Este é o conteúdo do texto após a alteração. Você não deve tentar modificar esse valor aqui. Modificar oeditable
emafterTextChanged
se você precisa.start
: Este é o índice do início de onde o novo texto foi inserido.before
: Este é o valor antigo. É o tamanho do texto selecionado anteriormente que foi substituído. Este é o mesmo valor quecount
embeforeTextChanged
.count
: Este é o tamanho do texto que foi inserido. Este é o mesmo valor queafter
embeforeTextChanged
.afterTextChanged
afterTextChanged(Editable editable)
Como
onTextChanged
, isso é chamado depois que a alteração já foi feita. No entanto, agora o texto pode ser modificado.editable
: Este é o texto editável doEditText
. Se você mudar, no entanto, você deve ter cuidado para não entrar em um loop infinito. Veja a documentação para mais detalhes.Imagem suplementar desta resposta
fonte
TextWatcher maritalStatusTextWatcher = new TextWatcher () {@Override public void beforeTextChanged (CharSequence charSequence, int i, int i1, int i2) {
fonte