¿Cómo configurar mediante programación maxLength en Android TextView?


176

Me gustaría establecer la maxLengthpropiedad mediante programación TextViewya que no quiero codificarlo en el diseño. No puedo ver ningún setmétodo relacionado con maxLength.

¿Alguien puede guiarme para lograr esto?

Respuestas:


363

Debería ser algo así. pero nunca lo usé para textview, solo edittext:

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

119
Sobre la base de eso, podría ser mucho más limpio ir: tv.setFilters (nuevo InputFilter [] {nuevo InputFilter.LengthFilter (10)});
Mark D

43
No podría simplemente decir "maxLength ()" ... no, no, no ... eso sería demasiado fácil. tuvieron que hacer un resumen ... ¡sí!
angryITguy

3
Pero esto restablecerá tus filtros anteriores, ¿no?
crgarridos

19
Con Kotlin puede hacerlo más limpio: editText.filters = arrayOf (InputFilter.LengthFilter (10))
Elvis Chidera

55
editText.filters = arrayOf(*editText.filters, InputFilter.LengthFilter(10))mantener viejos filtros con kotlin
Peter Samokhin

85

Prueba esto

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

1
Esto funciona para mí, pero en Android 5.1 aún puede seguir escribiendo letras, que son "invisibles" en el campo de entrada. Pero se muestran en la propuesta de texto. Y cuando intentas eliminar letras al final.
Radon8472

11
Esta no es "otra forma", esta es la versión corta de la primera respuesta, de la misma manera.
Ninja Coding

21

Límite fácil de editar caracteres de texto :

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

16

Para aquellos de ustedes que usan Kotlin

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

Entonces puede usar un simple editText.limitLength (10)


1
¿por qué no usar setMaxLength como nombre de función? podría aplicar esto a la vista de texto también ... gracias +1 :)
crgarridos

Tengo otros métodos que siguen este patrón: limitDecimalPlaces, limitNumberOnly, limitAscii para ir junto con limitLength.
Kevin

1
filtros = filtros.plus (InputFilter.LengthFilter (max)) No sobrescriba los existentes
ersin-ertan

7

Como dijo João Carlos , en el uso de Kotlin:

editText.filters += InputFilter.LengthFilter(10)

Consulte también https://stackoverflow.com/a/58372842/2914140 sobre el comportamiento extraño de algunos dispositivos.

(Añadir android:inputType="textNoSuggestions"a tu EditText.)


1
Es un error de creación si desea cambiar la longitud más tarde, como en mi caso, cambio MaxLength de 10 a 20, pero como en el código agregamos filtro, permanece configurado MaxLength 10 bcus ahora en la matriz, tenemos 10,20 dos longitudes máximas.
Nikhil

@Nikhil, de acuerdo contigo, ¡gracias! Sí, en este caso primero debemos eliminar un filtro ( LengthFilter(10)) y luego agregar otro ( LengthFilter(20)).
CoolMind

6

Para Kotlin y sin reiniciar los filtros anteriores:

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

Hice una función de extensión simple para este

/**
 * 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

la mejor solución que encontré

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

No limitará una longitud de EditText, pero corta un texto después del décimo símbolo (una vez).
CoolMind

0

Para mantener el filtro de entrada original, puede hacerlo de esta manera:

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);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.