【问题标题】:Limit a EditText to exactly certain number of word count将 EditText 限制为完全确定的字数
【发布时间】:2017-03-15 05:35:58
【问题描述】:

我们如何将EditText 的长度限制为一定的字数(100 个字)。

即使从某个地方复制大文本,粘贴时也只能接受 100 个单词。 我知道我们可以通过字符数来限制它 (maxLength)

我尝试使用以下代码,但它并没有将其限制在 100 个字以内,而且它允许复制粘贴大文本。

editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {

                int wordsLength = countWords(charSequence.toString());// words.length;
                // count == 0 means a new word is going to start
                if (count == 0 && wordsLength >= MAX_WORD_LIMIT) {
                    int charLength = mDescription.getText().length();
                    setCharLimit(mDescription, charLength > 0 ? charLength - 2 : charLength);
                } else {
                    removeFilter(mDescription);
                }

private InputFilter filter;

    private void setCharLimit(EditText et, int max) {
        filter = new InputFilter.LengthFilter(max);
        et.setFilters(new InputFilter[]{filter});
    }

    private void removeFilter(EditText et) {
        if (filter != null) {
            et.setFilters(new InputFilter[0]);
            filter = null;
        }
    }

【问题讨论】:

标签: android android-edittext


【解决方案1】:
    edittext.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

   @Override
   public void onTextChanged(CharSequence charSequence, int start, int before, int count) {

            //To fix word count
            String yourText= editText.getText().toString().replace(String.valueOf((char) 160), " ");
            if (yourText.split("\\s+").length > MAX_WORD_LIMIT ) {

                int space = 0;
                int length = 0;
                for (int i = 0; i < yourText.length(); i++) {
                    if (yourText.charAt(i) == ' ') {
                        space++;
                        if (space >= MAX_WORD_LIMIT) {
                            length = i;
                            break;
                        }

                    }
                }
                if (length > 1) {
                    editText.getText().delete(length, yourSelf.length()); // deleting last space
                    setCharLimit(editText, length - 1); //or limit edit text
                }
            } else {
                removeFilter(editText);
            }


        }

            @Override
            public void afterTextChanged(Editable s) {

        });
          private InputFilter filter;

          private void setCharLimit(EditText et, int max) {
            filter = new InputFilter.LengthFilter(max);
            et.setFilters(new InputFilter[] { filter });
            }

          private void removeFilter(EditText et) {
            if (filter != null) {
              et.setFilters(new InputFilter[0]);
             filter = null;
             }
           }

这里 160 是 非中断空间

【讨论】:

  • 如果有两个连续的空白,这将不起作用。
  • @theblitz 为什么我们在单词之间放两个空格
  • @KiranBennyJoseph 它确实发生了。有时人们会不小心多加一个空格。只需添加对前一个字符的检查,以确保它不是空白。
  • @KiranBennyJoseph 检查 s.equals(' ') 永远不会返回 true,s 将始终包含您输入的整个文本。
  • 我同意@theblitz 的评论
【解决方案2】:

您可以使用:

android:maxLength="50"

在您的 EditText 中。

【讨论】:

  • 请完整阅读问题。我知道这会受到字符数的限制,我需要通过字数来控制它
  • @Ram 在 afterTextChanged(Editable s) 而不是 beforeTextChanged 中编写代码。
【解决方案3】:

希望它对你有用

edittext.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
           // Check your edittext length here
           if (edittext.getText().toString().length() > 100)
              edittext.setText(edittext.getText().toString().substring(0, 100);
        }
    });

【讨论】:

【解决方案4】:

Kotlin 语言 -- 检查最大字数需要检查总空间

--> 第一步

var filter: InputFilter?=null

--> 第二步


edt.addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(s: Editable?) {

                var count : Int = 0

                if(s.toString().length > 0)

                    for(i in 0..s.toString().length-1){

                        if(s.toString()[i].toString() == " "){
                            count++
                        }

                        if(i > 1 && s.toString()[i-1].toString() == " " && s.toString()[i].toString() == " "){
                            count--
                        }

                    }

                if (count >= MAX_COUNTS_WORDS){
                    filter = InputFilter.LengthFilter(edt.text.toString().length)
                    edt.filters = arrayOf<InputFilter>(filter ?: return)
                }
                else if (filter != null) {
                    edt.filters = arrayOfNulls(0)
                    filter = null

                }


            }

            override fun beforeTextChanged(s: CharSequence?, p1: Int, p2: Int, p3: Int) {
            }

            override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
            }

        })

【讨论】:

    【解决方案5】:

    如果要查找字数,可以使用 java 逻辑。

    String text = "More than 100 word sentence";
    String[] txtArr = text.split(" ");
    

    现在只选择前 100 个索引词。

    这只是一个技巧。可能有更优化的方法。

    【讨论】:

      【解决方案6】:

      您可以将 split 与函数索引一起使用。抱歉这么长的字符串,希望你能明白。只需提取一些变量。

      edittext.addTextChangedListener(new TextWatcher() {
                  @Override
                  public void beforeTextChanged(CharSequence s, int start, int count, int after) {
      
                  }
      
                  @Override
                  public void onTextChanged(CharSequence s, int start, int before, int count) {
      
                  }
      
                  @Override
                  public void afterTextChanged(Editable s) {
      
                     if (edittext.getText().toString().split(" ").size() > 100)
                        edittext.setText(edittext.getText().toString().substring(0, edittext.getText().toString().indexOf(edittext.getText().toString().split(" ").get(100))));
                  }
              });
      

      【讨论】:

        【解决方案7】:

        使用edittext的android:maxLength属性来解决你的问题。

        【讨论】:

          猜你喜欢
          • 2011-07-09
          • 1970-01-01
          • 1970-01-01
          • 2012-06-14
          • 2015-08-12
          • 2015-08-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多