Contando caracteres no ouvinte alterado EditText

272

No meu projeto eu tenho um EditText. Quero contar os caracteres no EditTexte 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){}
}); 
Hesam
fonte
36
Por favor, perdoe a irrelevância, mas estou curioso para saber como você colocou o "backspace" na formatação da sua pergunta? Fiz perguntas semelhantes em que essa técnica teria sido muito útil.
precisa saber é o seguinte
59
Coloque sua palavra (neste caso, Backspace) entre tags <kbd> </kbd>, como: <kbd> Backspace </kbd>
Hesam
2
Sempre que vir uma formatação interessante (como "backspace"), você sempre pode clicar no link "editar" para ver como o autor fez. Em seguida, basta clicar em "cancelar" para descartar sua edição.
Suragch 7/11

Respostas:

142

Usar

s.length()

O seguinte foi sugerido em uma das respostas, mas é muito ineficiente

textMessage.getText().toString().length()
xtempore
fonte
38

Que tal apenas obter o comprimento do caractere no seu EditText e exibi-lo?

algo ao longo da linha de

tv.setText(s.length() + " / " + String.valueOf(charCounts));
Andreas Wong
fonte
6
É ainda mais fácil do que isso - você pode simplesmente ligar textMessage.length(), sem necessidade de fazer getText().toString(). developer.android.com/reference/android/widget/...
Yoni Samlan
28

poucas mudanças no seu código:

TextView tv = (TextView)findViewById(R.id.charCounts);
textMessage = (EditText)findViewById(R.id.textMessage);
textMessage.addTextChangedListener(new TextWatcher(){
    public void afterTextChanged(Editable s) {
        tv.setText(String.valueOf(s.toString().length()));
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after){}
    public void onTextChanged(CharSequence s, int start, int before, int count){}
}); 
KKumar
fonte
1
Isso não vai funcionar como escrito - length () retorna um int e setText espera uma String
Martin Lockett
1
@MartinLockett use Integer.toString (int_type) para converter string em int.
Mehdi Rostami
6

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.

EditText editText = (EditText) findViewById(R.id.testEditText);
editText.addTextChangedListener(new TextWatcher() {

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

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int start, int before, int count)  {

    }

    @Override
    public void afterTextChanged(Editable editable) {

    }
});

O ouvinte precisa de um TextWatcher, o que requer três métodos para ser substituído: beforeTextChanged, onTextChanged, e afterTextChanged.

Contando os caracteres

Você pode obter a contagem de caracteres em onTextChangedou beforeTextChangedcom

charSequence.length()

ou afterTextChangedcom

editable.length()

Significado 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, countserá 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 o editableem afterTextChangedse 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 que countem beforeTextChanged.
  • count: Este é o tamanho do texto que foi inserido. Este é o mesmo valor que afterem beforeTextChanged.

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 do EditText. 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

insira a descrição da imagem aqui

Suragch
fonte
0

TextWatcher maritalStatusTextWatcher = new TextWatcher () {@Override public void beforeTextChanged (CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        try {
            if (charSequence.length()==0){
                topMaritalStatus.setVisibility(View.GONE);
            }else{
                topMaritalStatus.setVisibility(View.VISIBLE);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void afterTextChanged(Editable editable) {

    }
};
Chandan Bera
fonte