无法显示超出的最大字符数

时间:2018-01-15 11:27:33

标签: java android input-filter

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

我使用的XML代码片段如下

                             <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 exceeed 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个字符,因为Toast回调中的filter消息是没有显示。

我已尝试使用TextWatcher,但在第21个字符后未调用,因为我已使用InputFilter将限制设置为21。

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

2 个答案:

答案 0 :(得分:1)

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

刚刚将dest.length() > getMax()更改为dest.length() == getMax()

经过上述修改后,当我使用退格键清除一个角色时,仍会显示toast。

经过少量分析后,我发现source返回用户键入的字符,dest返回EditText中显示的字符。在InputFilter之前调用TextWatcher时,dest会在用户选择退格时返回相同的长度。

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

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

最后,代码段变为

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 exceeed 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:testname123456testname source有时只返回我键入的字符,当它的数字为零或者较小时。否则,它会返回完整的字符以及我刚刚键入的字符。

dest.toString().length() < 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);
        }
    };

希望这会帮助别人。

答案 1 :(得分:0)

尝试使用此代码,同时将edittext的最大长度保持为21 xml

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

            }
        });