116 votes

Nombre de caractères en direct pour EditText

Je me demandais quelle était la meilleure façon de compter en direct les caractères d'une boîte de texte à éditer sous Android. J'ai regardé ce mais je n'arrivais pas à trouver un sens à tout ça.

Pour décrire le problème, j'ai un EditText et j'essaie de limiter les caractères à 150. Je peux le faire avec un filtre d'entrée, mais je veux montrer juste en dessous de la zone de texte le nombre de caractères qu'un utilisateur a entré (presque comme stack overflow le fait en ce moment).

Si quelqu'un pouvait écrire un petit bout de code d'exemple ou m'indiquer la bonne direction, je l'apprécierais beaucoup.

166voto

Cameron Ketcham Points 1874

Vous pouvez utiliser un TextWatcher pour voir quand le texte a changé

private TextView mTextView;
private EditText mEditText;
private final TextWatcher mTextEditorWatcher = new TextWatcher() {
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        public void onTextChanged(CharSequence s, int start, int before, int count) {
           //This sets a textview to the current length
           mTextView.setText(String.valueOf(s.length()));
        }

        public void afterTextChanged(Editable s) {
        }
};

vous définissez le TextWatcher pour l'edittext avec

mEditText.addTextChangedListener(mTextEditorWatcher);

6 votes

J'ai essayé, ça marche très bien ! Il faut choisir la bonne réponse !

2 votes

Quelle serait la meilleure façon d'ajouter le nombre de mots en bas à droite de la zone de texte ? Étendre l'édition du texte et dessiner la chaîne manuellement ?

1 votes

Merci, je l'ai aussi compris, mais comment obtenir le décompte dans l'ordre inverse comme 150,149,148,147.... tout en entrant le texte.

121voto

wonderkid Points 578

Vous pouvez compter les caractères à partir de xml lui-même en utilisant TextInputLayout pour EditText introduit dans SupportLibrary v23.1

Il suffit d'envelopper votre EditText dans un TextInputLayout, de définir CounterEnabled sur true et de définir un counterMaxLength.

<android.support.design.widget.TextInputLayout
    android:id="@+id/textContainer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:counterEnabled="true"
    app:counterMaxLength="20"
    >
    <EditText
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Text Hint"
        />
</android.support.design.widget.TextInputLayout>

Vous obtiendrez un effet matériel comme ce

Vous pouvez utiliser counterOverflowTextAppearance , contreTextApparence pour styliser le compteur.

EDITAR

Extrait de la documentation Android.

En TextInputEditText est fournie pour être utilisée comme enfant de ce modèle. L'utilisation de TextInputEditText permet à TextInputLayout de mieux contrôler les aspects visuels de toute entrée de texte. Un exemple d'utilisation est le suivant :

     <android.support.design.widget.TextInputLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content">

     <android.support.design.widget.TextInputEditText
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:hint="@string/form_username"/>

 </android.support.design.widget.TextInputLayout>

TextInputLayout TextInputEditText

4 votes

C'est exactement ce que je cherchais :) une impl implémentation propre de la bibliothèque de support. merci

4 votes

La réponse devrait être acceptée ! J'ai totalement manqué ces attributs !

33voto

Daniel G. R. Points 172

Vous pouvez le faire avec TextInputLayout et les bibliothèques compat avec :

app:counterEnabled="true"
app:counterMaxLength="420"

et complet :

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:counterEnabled="true"
    app:counterMaxLength="420">

    <EditText
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:maxLength="420" />

</android.support.design.widget.TextInputLayout>

1 votes

Je n'ai pas eu de problème avec la couleur du comptoir.

20voto

Amal Kronz Points 579

Dans le xml ajouter cet attribut pour editText

    android:maxLength="80"

en java ajouter ce listener

  ed_caption.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

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

        }

        @Override
        public void afterTextChanged(Editable s) {
            tv_counter.setText(80 - s.toString().length() + "/80");

        }
    });

8voto

Depinder Bharti Points 31

C'est très simple : suivez les instructions ci-dessous :

\====Ajoutez-les à vos importations===

import android.text.Editable;
import android.text.TextWatcher;

\=====Define this=====

private TextView sms_count;

\==========Inside On Create=====

sms_count = (TextView) findViewById(R.id.textView2);

final TextWatcher txwatcher = new TextWatcher() {
   public void beforeTextChanged(CharSequence s, int start, int count, int after) {
   }

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

      sms_count.setText(String.valueOf(s.length()));
   }

   public void afterTextChanged(Editable s) {
   }
};

sms_message.addTextChangedListener(txwatcher);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X