Conteggio dei caratteri nel listener modificato di EditText


272

Nel mio progetto ho un EditText. Voglio contare i caratteri in EditText, e mostrare quel numero in a TextView. Ho scritto il seguente codice e funziona benissimo. Tuttavia, il mio problema è quando faccio clic su Backspaceconta, ma devo ridurre il numero. Come posso considerare 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){}
}); 

36
Per favore, perdona l'irrilevanza ma sono curioso di sapere come hai inserito lo "backspace" nella formattazione della tua domanda? Ho fatto domande simili in cui quella tecnica sarebbe stata molto utile.
AlleyOOP

59
Inserisci la tua parola (in questo caso Backspace) tra <kbd> </kbd> tag come: <kbd> Backspace </kbd>
Hesam

2
Ogni volta che vedi una formattazione interessante (come "backspace"), puoi sempre fare clic sul link "modifica" per vedere come l'autore ha fatto. Quindi fai clic su "annulla" per annullare la modifica.
Suragch,

Risposte:


142

Uso

s.length()

Quanto segue è stato suggerito una volta in una delle risposte, ma è molto inefficiente

textMessage.getText().toString().length()


28

qualche piccola modifica nel tuo codice:

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){}
}); 

1
Questo non funzionerà come scritto - length () restituisce un int e setText si aspetta una stringa
Martin Lockett,

1
@MartinLockett usa Integer.toString (int_type) per convertire la stringa in int.
Mehdi Rostami,

6

Questa è una risposta leggermente più generale con maggiori spiegazioni per i futuri spettatori.

Aggiungi un ascoltatore modificato di testo

Se vuoi trovare la lunghezza del testo o fare qualcos'altro dopo che il testo è stato modificato, puoi aggiungere un listener modificato dal testo al tuo testo di modifica.

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) {

    }
});

L'ascoltatore ha bisogno di una TextWatcher, che richiede tre metodi per essere sovrascritto: beforeTextChanged, onTextChangede afterTextChanged.

Contando i personaggi

Puoi ottenere il conteggio dei personaggi dentro onTextChangedo beforeTextChangedcon

charSequence.length()

o in afterTextChangedcon

editable.length()

Significato dei metodi

I parametri sono un po 'confusi, quindi ecco una piccola spiegazione in più.

beforeTextChanged

beforeTextChanged(CharSequence charSequence, int start, int count, int after)

  • charSequence: Questo è il contenuto del testo prima che venga apportata la modifica in sospeso. Non dovresti provare a cambiarlo.
  • start: Questo è l'indice di dove verrà inserito il nuovo testo. Se viene selezionato un intervallo, allora è l'indice iniziale dell'intervallo.
  • count: Questa è la lunghezza del testo selezionato che verrà sostituito. Se non viene selezionato nulla, countlo sarà 0.
  • after: questa è la lunghezza del testo da inserire.

OnTextChanged

onTextChanged(CharSequence charSequence, int start, int before, int count)

  • charSequence: Questo è il contenuto del testo dopo la modifica. Non dovresti provare a modificare questo valore qui. Modificare editablein afterTextChangedse necessario.
  • start: Questo è l'indice dell'inizio di dove è stato inserito il nuovo testo.
  • before: Questo è il vecchio valore. È la lunghezza del testo precedentemente selezionato che è stato sostituito. Questo è lo stesso valore di countin beforeTextChanged.
  • count: Questa è la lunghezza del testo che è stato inserito. Questo è lo stesso valore di afterin beforeTextChanged.

afterTextChanged

afterTextChanged(Editable editable)

Ad esempio onTextChanged, questo viene chiamato dopo che la modifica è già stata apportata. Tuttavia, ora il testo può essere modificato.

  • editable: Questo è il testo modificabile di EditText. Se lo cambi, però, devi stare attento a non entrare in un ciclo infinito. Vedi la documentazione per maggiori dettagli.

Immagine supplementare da questa risposta

inserisci qui la descrizione dell'immagine


0

TextWatcher maritalStatusTextWatcher = new TextWatcher () {@Override void pubblico 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) {

    }
};
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.