Как программно установить maxLength в Android TextView?

Я хотел бы программно установить свойство maxLength для TextView, поскольку я не хочу жестко кодировать его в макете. Я не вижу никаких set методов, связанных с maxLength.

Может ли кто-нибудь посоветовать мне, как этого добиться?


person UMAR-MOBITSOLUTIONS    schedule 17.03.2010    source источник


Ответы (10)


Должно быть что-то в этом роде. но никогда не использовал его для текстового просмотра, только для редактирования текста:

TextView tv = new TextView(this);
int maxLength = 10;
InputFilter[] fArray = new InputFilter[1];
fArray[0] = new InputFilter.LengthFilter(maxLength);
tv.setFilters(fArray);
person Sephy    schedule 17.03.2010
comment
Исходя из этого, было бы намного проще пойти: tv.setFilters (new InputFilter [] {new InputFilter.LengthFilter (10)}); - person Mark D; 16.05.2012
comment
Нельзя просто сказать maxLength () ... нет, нет, нет ... это было бы слишком просто. они должны были сделать это абстрактным .. ура! - person angryITguy; 15.07.2016
comment
Но это сбросит ваши предыдущие фильтры, не так ли? - person crgarridos; 11.10.2017
comment
С Kotlin вы можете сделать его чище: editText.filters = arrayOf (InputFilter.LengthFilter (10)) - person Elvis Chidera; 09.12.2017
comment
editText.filters = arrayOf(*editText.filters, InputFilter.LengthFilter(10)) сохраняйте старые фильтры с помощью котлина - person Peter Samokhin; 26.07.2019

Попробуй это

int maxLengthofEditText = 4;    
editText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(maxLengthofEditText)});
person IntelliJ Amiya    schedule 26.06.2015
comment
У меня это работает, но в Android 5.1 вы все еще можете продолжать вводить буквы, они просто невидимы в поле ввода. Но они показаны в текстовом предложении. И при попытке удалить буквы в конце. - person Radon8472; 03.12.2015
comment
Это не другой способ, это краткая версия первого ответа, точно так же. - person Ninja Coding; 11.01.2016

Простой способ ограничить редактирование текстового символа:

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

Для тех из вас, кто использует Kotlin

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

Тогда вы можете просто использовать простой editText.limitLength (10)

person Kevin    schedule 29.09.2017
comment
почему бы не использовать setMaxLength в качестве имени функции? вы также можете применить это к текстовому просмотру ... спасибо +1 :) - person crgarridos; 11.10.2017
comment
У меня есть другие методы, которые следуют этому шаблону: limitDecimalPlaces, limitNumberOnly, limitAscii вместе с limitLength. - person Kevin; 13.10.2017
comment
filter = filters.plus (InputFilter.LengthFilter (max)) Не перезаписывать существующие - person ersin-ertan; 30.10.2018

Как сказал Жоао Карлос, в Kotlin используйте:

editText.filters += InputFilter.LengthFilter(10)

См. Также https://stackoverflow.com/a/58372842/2914140 о странном поведении некоторых устройств.

(Добавьте android:inputType="textNoSuggestions" к своему EditText.)

person CoolMind    schedule 10.10.2019
comment
Это создает ошибку, если вы хотите изменить длину в последнем случае, как в моем случае, я изменяю MaxLength с 10 на 20, но, как и в коде, мы добавляем фильтр, который остается установленным MaxLength 10 bcus, теперь в массиве у нас есть 10,20 две максимальные длины. - person Nikhil; 29.06.2020
comment
@Nikhil, согласен с тобой, спасибо! Да, в этом случае мы должны сначала удалить один фильтр (LengthFilter(10)), а затем добавить другой (LengthFilter(20)). - person CoolMind; 29.06.2020

Для Kotlin и без сброса предыдущих фильтров:

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))
person santalu    schedule 14.11.2018

Я сделал простую функцию расширения для этого

/**
 * 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)
person Kyriakos Georgiopoulos    schedule 20.03.2020

лучшее решение, которое я нашел

textView.setText(text.substring(0,10));
person Sai Gopi Me    schedule 20.06.2019
comment
Он не ограничивает длину EditText, но обрезает текст после 10-го символа (один раз). - person CoolMind; 10.10.2019

Чтобы сохранить исходный входной фильтр, вы можете сделать это следующим образом:

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);
person hanswim    schedule 09.12.2019

Мое решение для SWIFT 5

editText.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(123))
person Serhii Stakhiv    schedule 03.09.2020