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?

SOLUTIONS UMAR-MOBITS
la source

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);
Sephy
la source
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)});
IntelliJ Amiya
la source
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)});
Farid Ahmed
la source
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)

Kevin
la source
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.)

CoolMind
la source
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))
Santalu
la source
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)
Kyriakos Georgiopoulos
la source
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);
Exception de pointeur nul
la source
0

meilleure solution que j'ai trouvée

textView.setText(text.substring(0,10));
Sai Gopi N
la source
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);
Hanswim
la source