Como definir programaticamente maxLength no Android TextView?

176

Gostaria de definir programaticamente a maxLengthpropriedade, TextViewpois não quero codificá-la no layout. Não consigo ver nenhum setmétodo relacionado a maxLength.

Alguém pode me orientar como conseguir isso?

UMAR-MOBITSOLUTIONS
fonte

Respostas:

363

Deveria ser algo assim. mas nunca o usou para textview, apenas edittext:

TextView tv = new TextView(this);
int maxLength = 10;
InputFilter[] fArray = new InputFilter[1];
fArray[0] = new InputFilter.LengthFilter(maxLength);
tv.setFilters(fArray);
Sephy
fonte
119
Com base nisso, pode ser muito mais limpo: tv.setFilters (new InputFilter [] {new InputFilter.LengthFilter (10)});
Mark D
43
Não poderia simplesmente dizer "maxLength ()" .. não, não, não .. isso seria muito fácil. eles tiveram que fazer abstrato .. yay!
angryITguy
3
Mas isso redefinirá seus filtros anteriores, não?
Crgarridos 11/11
19
Com Kotlin você pode torná-lo mais limpo: editText.filters = arrayOf (InputFilter.LengthFilter (10))
Elvis Chidera
5
editText.filters = arrayOf(*editText.filters, InputFilter.LengthFilter(10))mantenha os filtros antigos com Kotlin
Peter Samokhin
85

Tente isto

int maxLengthofEditText = 4;    
editText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(maxLengthofEditText)});
IntelliJ Amiya
fonte
1
Isso funciona para mim, mas no Android 5.1 você ainda pode continuar digitando letras, elas são "invisíveis" no campo de entrada. Mas eles são mostrados na proposta de texto. E quando você tenta excluir as letras no final.
Radon8472
11
Esta não é "outra maneira", é a versão curta da primeira resposta, da mesma maneira.
Ninja Coding
21

Limite de maneira fácil de editar o caractere de texto :

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

Para aqueles que usam o Kotlin

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

Em seguida, você pode simplesmente usar um simples editText.limitLength (10)

Kevin
fonte
1
por que não usar setMaxLength como nome da função? você poderia aplicar isso a textview também ... graças +1 :)
crgarridos
Eu tenho outros métodos que seguem esse padrão: limitDecimalPlaces, limitNumberOnly, limitAscii para ir junto com limitLength.
Kevin
1
filtros = filters.plus (InputFilter.LengthFilter (max)) não substituir existente ones
ersin-ertan
7

Como João Carlos disse, em Kotlin use:

editText.filters += InputFilter.LengthFilter(10)

Consulte também https://stackoverflow.com/a/58372842/2914140 sobre o comportamento estranho de alguns dispositivos.

(Adicione android:inputType="textNoSuggestions"ao seu EditText.)

CoolMind
fonte
1
Seu bug de criação, se você quiser alterar o comprimento mais tarde, como no meu caso, altero o MaxLength de 10 para 20, mas, como no código, adicionamos o filtro, seu conjunto permanece MaxLength 10 bcus agora no array, temos 10,20 dois comprimentos máximos.
Nikhil
@ Nikhil, concordo com você, obrigado! Sim, neste caso, devemos primeiro remover um filtro ( LengthFilter(10)) e depois adicionar outro ( LengthFilter(20)).
CoolMind
6

Para o Kotlin e sem redefinir os 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
fonte
1

Eu criei uma função de extensão simples 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
fonte
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);
Null Pointer Exception
fonte
0

melhor solução que encontrei

textView.setText(text.substring(0,10));
Sai Gopi N
fonte
Não limitará um comprimento de EditText, mas corta um texto após o 10º símbolo (uma vez).
CoolMind
0

Para manter o filtro de entrada original, você pode fazer o seguinte:

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
fonte