【问题标题】:How to programmatically set maxLength in Android TextView?如何以编程方式在 Android TextView 中设置 maxLength?
【发布时间】:2011-01-28 13:01:50
【问题描述】:

我想以编程方式设置TextViewmaxLength 属性,因为我不想在布局中对其进行硬编码。我看不到任何与maxLength 相关的set 方法。

谁能指导我如何做到这一点?

【问题讨论】:

    标签: android textview maxlength


    【解决方案1】:

    应该是这样的。但从未将其用于文本视图,仅用于编辑文本:

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

    【讨论】:

    • 在此基础上,它可能会更干净: tv.setFilters( new InputFilter[] { new InputFilter.LengthFilter(10) } );
    • 不能只说“maxLength()”.. 不,不,不.. 这太容易了。他们必须把它抽象出来……耶!
    • 但这会重置你以前的过滤器,不是吗?
    • 使用 Kotlin 你可以让它更干净:editText.filters = arrayOf(InputFilter.LengthFilter(10))
    • editText.filters = arrayOf(*editText.filters, InputFilter.LengthFilter(10)) 使用 kotlin 保留旧过滤器
    【解决方案2】:

    试试这个

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

    【讨论】:

    • 这对我有用,但在 Android 5.1 中,您仍然可以继续输入字母,输入字段中的字母“不可见”。但它们显示在文本提案中。当您尝试删除最后的字母时。
    • 这不是“另一种方式”,这是第一个答案的简短版本,同样的方式。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      对于那些使用 Kotlin 的人

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

      那么你可以只使用一个简单的editText.limitLength(10)

      【讨论】:

      • 为什么不使用 setMaxLength 作为函数名?您也可以将其应用于 textview...谢谢+1 :)
      • 我还有其他遵循这种模式的方法:limitDecimalPlaces、limitNumberOnly、limitAscii 以及 limitLength。
      • filters = filters.plus(InputFilter.LengthFilter(max)) 不要覆盖现有的
      【解决方案5】:
           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);
      

      【讨论】:

        【解决方案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))
        

        【讨论】:

          【解决方案7】:

          我找到的最佳解决方案

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

          【讨论】:

          • 它不会限制EditText的长度,但会在第10个符号之后截断一段文字(一次)。
          【解决方案8】:

          正如João Carlos 所说,在 Kotlin 中使用:

          editText.filters += InputFilter.LengthFilter(10)
          

          另请参阅https://stackoverflow.com/a/58372842/2914140,了解一些设备的奇怪行为。

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

          【讨论】:

          • 如果你想改变长度,它会创建错误,就像在我的情况下,我将 MaxLength 从 10 更改为 20,但是在代码中我们添加过滤器,它的保持设置 MaxLength 10 bcus 现在在数组中我们有 10, 20 两个最大长度。
          • @Nikhil,同意你的看法,谢谢!是的,在这种情况下,我们应该先删除一个过滤器 (LengthFilter(10)),然后再添加另一个过滤器 (LengthFilter(20))。
          【解决方案9】:

          要保留原始输入过滤器,您可以这样做:

          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);
          

          【讨论】:

            【解决方案10】:

            我为这个做了一个简单的扩展函数

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

            【讨论】:

              【解决方案11】:

              我的 SWIFT 5 解决方案

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

              【讨论】:

                猜你喜欢
                • 2011-12-16
                • 2013-02-07
                • 2017-10-20
                • 2017-08-23
                • 1970-01-01
                • 2019-03-27
                • 2011-03-09
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多