如何在Android TextView中以编程方式设置最大长度?

194

我希望以编程方式设置TextViewmaxLength属性,因为我不想在布局中硬编码它。 我没有看到任何与maxLength相关的set方法。

有没有人可以指导我如何实现这个目标?

11个回答

380

应该是这样的。但我从未在TextView上使用过它,只在EditText上使用过:

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

123
在此基础上,可能更加清晰的做法是:tv.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)}); - Mark D
48
不能只是说“maxLength()”...不,不,不...那太简单了。他们必须将其抽象化...耶! - angryITguy
3
但这会重置你之前的筛选条件,对吧? - crgarridos
22
使用 Kotlin 可以更加简洁地实现此功能:editText.filters = arrayOf(InputFilter.LengthFilter(10))。 - Elvis Chidera
6
editText.filters = arrayOf(*editText.filters, InputFilter.LengthFilter(10)) 保留旧的过滤器,使用 Kotlin。 - Peter Samokhin

90

试试这个

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

1
这在我的设备上有效,但在Android 5.1中,您仍然可以继续输入字母,它们只是在输入框中“隐形”而已。但它们会显示在文本建议中。当您尝试删除结尾的字母时,问题就会出现。 - Radon8472
13
这并不是“另一种方式”,而是第一个答案的简短版本,使用相同的方法。 - Ninja Coding

24

对于使用 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
过滤器 = 过滤器.加(InputFilter.LengthFilter(最大值)) 不要覆盖现有的。 - ersin-ertan

22

简单的方法限制编辑文本字符数

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

15

1
如果您想像我一样将MaxLength从10更改为20,但是在代码中我们添加了过滤器,那么更改长度后会创建错误,因为现在数组中有10,20两个最大长度,所以它仍然设置为MaxLength 10。 - Nikhil
@Nikhil,我同意你的观点,谢谢!是的,在这种情况下,我们应该先删除一个过滤器(LengthFilter(10)),然后再添加另一个过滤器(LengthFilter(20))。 - CoolMind

8

使用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))

3
我为此编写了一个简单的扩展函数。
/**
 * 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)

1

我的 SWIFT 5 解决方案

editText.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(123))

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接