如何在Android TextView中以编程方式设置maxLength?


174

我想以编程方式设置maxLength属性,TextView因为我不想在布局中对其进行硬编码。我看不到任何setmaxLength

谁能指导我如何实现这一目标?

Answers:


363

应该是这样的。但从未将其用于textview,仅用于edittext:

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

119
在此基础上,可能更干净:tv.setFilters(new InputFilter [] {new InputFilter.LengthFilter(10)});
Mark D

43
不能只说“ maxLength()”。.不,不,不..那太容易了。他们必须把它抽象化..是的!
AngryITguy

3
但这会重置您以前的过滤器,不是吗?
crgarridos

19
使用Kotlin,您可以使其更整洁:editText.filters = arrayOf(InputFilter.LengthFilter(10))
Elvis Chidera

5
editText.filters = arrayOf(*editText.filters, InputFilter.LengthFilter(10))保留旧的过滤器与科特林
彼得Samokhin

84

试试这个

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

1
这对我有用,但是在Android 5.1中,您仍然可以继续输入字母,它们在输入字段中是“不可见的”。但是它们显示在文本提案中。并且当您尝试最后删除字母时。
Radon8472 2015年

11
这不是“另一种方式”,这是第一个答案的简短版本。
忍者编码


16

对于那些使用Kotlin的人

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

然后,您可以只使用一个简单的editText.limitLength(10)


1
为什么不使用setMaxLength作为函数名?你可以应用此TextView的也...谢谢:) +1
crgarridos

我还有其他遵循此模式的方法:limitDecimalPlaces,limitNumberOnly,limitAscii与limitLength一起使用。
凯文(Kevin)

1
过滤器= filters.plus(InputFilter.LengthFilter(MAX))不覆盖现有的
的Ersin -二滩

7

JoãoCarlos所说,在Kotlin中使用:

editText.filters += InputFilter.LengthFilter(10)

另请参阅https://stackoverflow.com/a/58372842/2914140,了解某些设备的异常行为。

(添加android:inputType="textNoSuggestions"到您的EditText。)


1
如果您想更改后一个长度,则会产生它的错误,例如在我的情况下,我将MaxLength从10更改为20,但是由于在代码中我们添加了过滤器,因此数组中剩余的MaxLength 10 bcus现在在数组中有10,20两个最大长度。
Nikhil

@Nikhil,同意你,谢谢!是的,在这种情况下,我们应该先删除一个过滤器(LengthFilter(10)),然后再添加另一个过滤器(LengthFilter(20))。
CoolMind

6

对于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))

1

我为此做了一个简单的扩展功能

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

我发现的最佳解决方案

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

它不会限制的长度EditText,但是会在第10个符号(一次)之后截断文本。
CoolMind

0

要保留原始输入过滤器,您可以按以下方式进行操作:

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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.