当前位置: 首页 > 知识库问答 >
问题:

无法显示超出最大字符数

郑西岭
2023-03-14

我正在开发一个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 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个字符,因为没有显示过滤器中的消息。

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

任何人,请帮我找到解决办法。

共有2个答案

戎桐
2023-03-14

尝试此代码,同时将xml中edittext的最大长度保持为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) {

            }
        });
戚明朗
2023-03-14

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

刚刚更改了dest.length()

经过上述修改后,当我使用退格清除字符时,仍会显示toast。

经过几次分析,我知道source返回用户键入的字符,而dest返回编辑文本中显示的字符。由于在TextWatcher之前调用了InputFilter,因此当用户选择backspace时,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 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();
        }
    };

更新:有一个奇怪的行为时,数字在est是高Ex: testname123456testname。source有时只返回我键入的字符,当它有零或更小的数字长度在it.otherwise,它返回完整的字符和我刚刚键入的字符。

dest.to字符串长度

因此,代码更新为

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

希望这能帮助其他人。

 类似资料:
  • 我的想法是在达到最大字符限制时,将错误设置为编辑文本。是否有关于此事件的回调,或者是否有其他方法可以实现此效果?提前谢谢。

  • VSCode 中是否有任何方法可以显示/突出显示通过 80 等行的字符限制的字符(可能忽略左侧的空格)?我有时会使用 Vim,在 Vim 中,有一个脚本。我已经搜索了VSCode Marketplace,但一无所获。我喜欢保持我的代码一致。

  • 本文向大家介绍Android中超大图片无法显示的问题解决,包括了Android中超大图片无法显示的问题解决的使用技巧和注意事项,需要的朋友参考一下 发现问题 最近在做图片浏览功能时遇到了一个很蛋疼的问题,在开启硬件加速情况下,超大图无法正常显示(图的长宽有一个大于9000),而且程序不会crash,只是图片加载不出来,View显示为黑色。通过查看日志,发现系统打印出了下面的内容: 从日志内容可以看

  • 第一次在JAVA项目上使用FreeMarker,在配置汉字时使用堆栈。 看到了一些对FreeMarker.Properties进行更改的示例请求,但我没有这个文件。我只是导入。jar文件并使用它。 请告诉我该怎么做才能让它显示汉字。

  • 我正在运行一个MapReduce Pipes程序,并将内存限制设置为如下所示: 在yarn-site.xml中: 在mapred-site.xml中: 我当前运行在伪分布式模式下的单个节点上。我在关闭容器之前收到以下错误: 问候,

  • 问题内容: 在两台计算机的HTML文件中显示数据库的结果时出现问题。 因此,在一台计算机上它显示的名称是这样的: 数据库的排序规则为,表的排序规则为。 在另一台计算机上,它显示如下(我希望这样): 名称在标签中列出。两种浏览器的语言是英语,并且Html文件在两种环境下都相同,所以我认为这与php.ini文件的字符集或编码有关 我曾尝试更改中的值,但没有任何变化,我在任何地方都找不到答案。 唯一的区