¿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?

UMAR-MOBITSOLUTIONS
fuente

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

Kevin
fuente
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.)

CoolMind
fuente
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))
santalu
fuente
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)
Kyriakos Georgiopoulos
fuente
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);
Excepción de puntero nulo
fuente
0

la mejor solución que encontré

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