Comment définir par programme maxLength dans Android TextView?


177

Je voudrais définir par programme la maxLengthpropriété de TextViewcar je ne veux pas la coder en dur dans la mise en page. Je ne vois aucune setméthode liée à maxLength.

Quelqu'un peut-il me guider comment y parvenir?

Réponses:


364

Ça devrait être quelque chose comme ça. mais jamais utilisé pour textview, seulement edittext:

TextView tv = new TextView(this);
int maxLength = 10;
InputFilter[] fArray = new InputFilter[1];
fArray[0] = new InputFilter.LengthFilter(maxLength);
tv.setFilters(fArray);

119
En s'appuyant sur cela, il pourrait être beaucoup plus propre d'utiliser: tv.setFilters (new InputFilter [] {new InputFilter.LengthFilter (10)});
Mark D

43
Je ne pouvais pas simplement dire "maxLength ()"… non, non, non… ce serait trop facile. ils ont dû le rendre abstrait .. yay!
angryITguy

3
Mais cela réinitialisera vos filtres précédents, non?
crgarridos

20
Avec Kotlin, vous pouvez le rendre plus propre: editText.filters = arrayOf (InputFilter.LengthFilter (10))
Elvis Chidera

5
editText.filters = arrayOf(*editText.filters, InputFilter.LengthFilter(10))garder les vieux filtres avec kotlin
Peter Samokhin

85

Essaye ça

int maxLengthofEditText = 4;    
editText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(maxLengthofEditText)});

1
Cela fonctionne pour moi, mais sous Android 5.1, vous pouvez toujours continuer à taper des lettres, elles sont simplement "invisibles" dans le champ de saisie. Mais ils sont indiqués dans la proposition de texte. Et lorsque vous essayez de supprimer des lettres à la fin.
Radon8472

11
Ce n'est pas "une autre façon" c'est la version courte de la première réponse, de la même manière.
Codage Ninja

21

Caractère de texte d'édition de limite de manière facile :

EditText ed=(EditText)findViewById(R.id.edittxt);
ed.setFilters(new InputFilter[]{new InputFilter.LengthFilter(15)});

16

Pour ceux d'entre vous qui utilisent Kotlin

fun EditText.limitLength(maxLength: Int) {
    filters = arrayOf(InputFilter.LengthFilter(maxLength))
}

Ensuite, vous pouvez simplement utiliser un simple editText.limitLength (10)


1
pourquoi ne pas utiliser setMaxLength comme nom de fonction? vous pouvez également l'appliquer à textview ... merci +1 :)
crgarridos

J'ai d'autres méthodes qui suivent ce modèle: limitDecimalPlaces, limitNumberOnly, limitAscii pour aller avec limitLength.
Kevin

1
filters = filters.plus (InputFilter.LengthFilter (max)) Ne pas écraser les existants
ersin-ertan

7

Comme l'a dit João Carlos , à Kotlin, utilisez:

editText.filters += InputFilter.LengthFilter(10)

Voir aussi https://stackoverflow.com/a/58372842/2914140 à propos du comportement étrange de certains appareils.

(Ajoutez android:inputType="textNoSuggestions"à votre EditText.)


1
Cela crée un bug si vous voulez changer la longueur plus tard, comme dans mon cas, je change MaxLength de 10 à 20, mais comme dans le code, nous ajoutons un filtre, il reste défini MaxLength 10 bcus maintenant dans le tableau, nous avons 10,20 deux longueurs max.
Nikhil le

@Nikhil, d'accord avec vous, merci! Oui, dans ce cas, nous devons d'abord supprimer un filtre ( LengthFilter(10)), puis en ajouter un autre ( LengthFilter(20)).
CoolMind le

6

Pour Kotlin et sans réinitialiser les filtres précédents:

fun TextView.addFilter(filter: InputFilter) {
  filters = if (filters.isNullOrEmpty()) {
    arrayOf(filter)
  } else {
    filters.toMutableList()
      .apply {
        removeAll { it.javaClass == filter.javaClass }
        add(filter)
      }
      .toTypedArray()
  }
}

textView.addFilter(InputFilter.LengthFilter(10))

1

J'ai fait une simple fonction d'extension pour celui-ci

/**
 * maxLength extension function makes a filter that 
 * will constrain edits not to make the length of the text
 * greater than the specified length.
 * 
 * @param max
 */
fun EditText.maxLength(max: Int){
    this.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(max))
}

editText?.maxLength(10)

0
     AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setTitle("Title");


                    final EditText input = new EditText(this);
                    input.setInputType(InputType.TYPE_CLASS_NUMBER);
//for Limit...                    
input.setFilters(new InputFilter[] {new InputFilter.LengthFilter(3)});
                    builder.setView(input);

0

meilleure solution que j'ai trouvée

textView.setText(text.substring(0,10));

Il ne limitera pas une longueur de EditText, mais coupera un texte après le 10e symbole (une fois).
CoolMind

0

Pour conserver le filtre d'entrée d'origine, vous pouvez le faire de cette façon:

InputFilter.LengthFilter maxLengthFilter = new InputFilter.LengthFilter(100);
        InputFilter[] origin = contentEt.getFilters();
        InputFilter[] newFilters;
        if (origin != null && origin.length > 0) {
            newFilters = new InputFilter[origin.length + 1];
            System.arraycopy(origin, 0, newFilters, 0, origin.length);
            newFilters[origin.length] = maxLengthFilter;
        } else {
            newFilters = new InputFilter[]{maxLengthFilter};
        }
        contentEt.setFilters(newFilters);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.