Comptage des caractères dans le récepteur modifié EditText

272

Dans mon projet, j'ai un EditText. Je veux compter les caractères dans le EditText, et montrer ce nombre dans un TextView. J'ai écrit le code suivant et cela fonctionne très bien. Cependant, mon problème est quand je clique Backspacedessus, mais je dois décrémenter le nombre. Comment puis-je considérer 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
la source
36
Veuillez pardonner la non-pertinence, mais je suis curieux de savoir comment vous avez placé le "retour arrière" dans la mise en forme de votre question? J'ai posé des questions similaires où cette technique aurait été très utile.
AlleyOOP
59
Placez votre mot (dans ce cas, Retour arrière) entre les balises <kbd> </kbd> telles que: <kbd> Retour arrière </kbd>
Hesam
2
Chaque fois que vous voyez une mise en forme intéressante (comme "backspace"), vous pouvez toujours cliquer sur le lien "modifier" pour voir comment l'auteur l'a fait. Cliquez ensuite sur "Annuler" pour annuler votre modification.
Suragch

Réponses:

142

Utilisation

s.length()

Ce qui suit a déjà été suggéré dans l'une des réponses, mais son très inefficace

textMessage.getText().toString().length()
xtempore
la source
38

que diriez-vous simplement d'obtenir la longueur du caractère dans votre EditText et de l'afficher?

quelque chose le long de la ligne de

tv.setText(s.length() + " / " + String.valueOf(charCounts));
Andreas Wong
la source
6
C'est encore plus facile que cela - vous pouvez simplement appeler textMessage.length(), pas besoin de le faire getText().toString(). developer.android.com/reference/android/widget/…
Yoni Samlan
28

peu de changements dans votre code:

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
la source
1
Cela ne fonctionnera pas car écrit - length () renvoie un entier et setText attend une chaîne
Martin Lockett
1
@MartinLockett utilise Integer.toString (int_type) pour convertir la chaîne en int.
Mehdi Rostami
6

Il s'agit d'une réponse légèrement plus générale avec plus d'explications pour les futurs téléspectateurs.

Ajouter un écouteur de texte modifié

Si vous souhaitez trouver la longueur du texte ou faire autre chose après que le texte a été modifié, vous pouvez ajouter un écouteur de texte modifié à votre texte d'édition.

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'auditeur a besoin d' un TextWatcher, ce qui nécessite trois méthodes pour être surchargée: beforeTextChanged, onTextChangedet afterTextChanged.

Compter les caractères

Vous pouvez obtenir le nombre de caractères dans onTextChangedou beforeTextChangedavec

charSequence.length()

ou afterTextChangedavec

editable.length()

Signification des méthodes

Les paramètres sont un peu déroutants alors voici une petite explication supplémentaire.

beforeTextChanged

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

  • charSequence: Il s'agit du contenu du texte avant la modification en attente. Vous ne devriez pas essayer de le changer.
  • start: Il s'agit de l'index de l'endroit où le nouveau texte sera inséré. Si une plage est sélectionnée, il s'agit de l'index de début de la plage.
  • count: Il s'agit de la longueur du texte sélectionné qui va être remplacé. Si rien n'est sélectionné, ce countsera le cas 0.
  • after: c'est la longueur du texte à insérer.

onTextChanged

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

  • charSequence: Il s'agit du contenu du texte après la modification. Vous ne devez pas essayer de modifier cette valeur ici. Modifiez l'entrée si vous editableen afterTextChangedavez besoin.
  • start: Il s'agit de l'index du début de l'endroit où le nouveau texte a été inséré.
  • before: Ceci est l'ancienne valeur. C'est la longueur du texte précédemment sélectionné qui a été remplacée. Il s'agit de la même valeur que countdans beforeTextChanged.
  • count: Il s'agit de la longueur du texte inséré. Il s'agit de la même valeur que afterdans beforeTextChanged.

afterTextChanged

afterTextChanged(Editable editable)

Comme onTextChanged, ceci est appelé après que le changement a déjà été effectué. Cependant, maintenant le texte peut être modifié.

  • editable: Ceci est le texte modifiable du EditText. Si vous le changez, cependant, vous devez faire attention à ne pas entrer dans une boucle infinie. Voir la documentation pour plus de détails.

Image supplémentaire de cette réponse

entrez la description de l'image ici

Suragch
la source
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
la source