【问题标题】:Unable to display that the maximum characters exceeded无法显示超过最大字符数
【发布时间】:2018-01-15 11:27:32
【问题描述】:

我正在开发一个 Android 应用程序,我想在其中设置输入过滤器以在 EditText 中只允许 21 个字符。

我使用的XML代码sn-p如下

                             <EditText
                                android:id="@+id/screen_name"
                                android:layout_width="300dp"
                                android:layout_height="match_parent"
                                android:background="#00000000"
                                android:enabled="false"
                                android:gravity="center"
                                android:hint="Enter your screen name"
                                android:maxLength="21"
                                android:text="Raghunathan KE"
                                android:textColor="#fff"
                                android:textSize="24sp"
                                android:textStyle="bold"
                                android:inputType="text"
                                android:isScrollContainer="true"
                                android:focusable="true"/>

而且,在活动中,

   InputFilter lengthFilter = new InputFilter.LengthFilter(21) {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            if (dest.length() > getMax()) {
                Toast.makeText(Profile.this, "Screen name should not exceed more than 21 characters", Toast.LENGTH_LONG).show();
            }

            return super.filter(source, start, end, dest, dstart, dend);
        }

        @Override
        public int getMax() {
            return super.getMax();
        }
    };

screenname.setInputFilters(new InputFilter[]{lengthFilter});

它不允许输入超过 21 个字符,但我无法提示用户长度不能超过 21 个字符,因为 filter 回调中的 Toast 消息不显示。

我尝试过使用TextWatcher,但它在第 21 个字符之后没有被调用,因为我使用InputFilter 将限制设置为 21。

任何人,请帮我找到解决方案。

【问题讨论】:

  • getmax() 是否返回 21?如果是这样,也许你需要一个 >= 而不是 > 来让你的吐司出现?
  • 当然它不会被显示,因为长度不能>然后是你在 xml 中设置的 Max。所以这个 "dest.length() > getMax()" 表达式总是假的。
  • 如果您想允许用户输入超过 21 个字符,那么您显然必须取消 21 个字符的限制。您可能想要一个TextWatcher,当它正在观看的EditText 字段包含超过21 个字符时,它将启动吐司/执行某些操作。
  • 条件应该是 if (dest.length() == getMax()) 并且 getMax() 应该返回 21 。
  • 为了实现你的目标,你已经回到了文本观察器,但没有设置最大长度。只需验证观察者中的数据,如果文本超过 21 个字符,则仅显示 toast 并删除多余的字符。

标签: java android input-filter


【解决方案1】:

感谢您的所有回复。在 ADM 的评论的帮助下,我终于找到了解决方法。

刚刚将dest.length() &gt; getMax()更改为dest.length() == getMax()

经过上面的修改,当我用退格键清除一个字符时,toast仍然显示。

经过几次分析,我知道source返回用户键入的字符,dest返回EditText中显示的字符。由于InputFilterTextWatcher 之前被调用,所以当用户选择退格时dest 返回相同的长度。

通过添加另一个验证来检查源的长度是否大于目标的长度来解决

dest.length() == getMax() && dest.toString().length() < source.toString().length()

最后,代码sn-p变成了

InputFilter lengthFilter = new InputFilter.LengthFilter(21) {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
           if (dest.length() == getMax() && dest.toString().length() < source.toString().length()) {
                Toast.makeText(Profile.this, "Screen name should not exceed more than 21 characters", Toast.LENGTH_SHORT).show();
            }
            return super.filter(source, start, end, dest, dstart, dend);
        }

        @Override
        public int getMax() {
            return super.getMax();
        }
    };

更新: 当 dest 中的数字很高时,会有一个奇怪的行为 Ex:testname123456testnamesource 有时只返回我键入的字符,而其中的数字长度为零或更少。否则,它会返回完整字符以及我刚刚键入的字符。

dest.toString().length() &lt; source.toString().length() 在第二种情况下返回false

所以,代码更新为

 private InputFilter.LengthFilter lengthFilter = new InputFilter.LengthFilter(maxLengthOfScreenName) {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            String numbers = dest.toString().replaceAll("[^0-9]", "");
            if (dest.toString().length() == maxLengthOfScreenName && ((dest.toString().length() < source.toString().length())
                    || (source.toString().length() == 1 && numbers.length() > 1))) {
                Toast.makeText(Profile.this,
                        "Screen name should not exceed more than " + maxLengthOfScreenName + " characters",
                        Toast.LENGTH_SHORT).show();

            }
            return super.filter(source, start, end, dest, dstart, dend);
        }
    };

希望这对其他人有帮助。

【讨论】:

    【解决方案2】:

    试试这个代码,同时保持你的edittext的最大长度在xml中为21

    yourEditText.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    if(count >= 21){
                        Toast.makeText(context, "Your Alert", 
                  Toast.LENGTH_SHORT).show();
                    }
                }
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
    
    
                }
    
                @Override
                public void afterTextChanged(Editable s) {
    
                }
            });
    

    【讨论】:

    • 谢谢,但即使长度为 21 也会显示 Toast。它应该仅在大于 21 时显示。
    • 只需使用&gt; 而不是&gt;=...您也应该根据文档将其放入afterTextChanged
    • 嗯,我想如果我们把 xml 中的 maxLength 设置为 21,它永远不会让用户输入超过 21。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2014-10-31
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多