【问题标题】:How to filter the input of EditText?如何过滤EditText的输入?
【发布时间】:2015-05-15 12:13:42
【问题描述】:

我想过滤EditText的输入,只允许数字和字母,首先我使用TextWatcher处理最后输入的字符,但是当你移动光标或者你过去一些内容到@ 987654324@,这个方法失败了,现在我想知道有没有办法过滤非法输入并给用户反馈。

【问题讨论】:

标签: android android-edittext textwatcher android-input-filter


【解决方案1】:

InputFilter 添加到您的EditText 并为用户提供Toast这段代码 sn-p 会帮助你。

 InputFilter filter = new InputFilter() {
                public CharSequence filter(CharSequence source, int start, int end,
                        Spanned dest, int dstart, int dend) {
                    for (int i = start; i < end; i++) {
                        if (!Character.isLetterOrDigit(source.charAt(i))) { // Accept only letter & digits ; otherwise just return
                            Toast.makeText(context,"Invalid Input",Toast.LENGTH_SHORT).show();
                            return "";
                        }
                    }
                    return null;
                }

            };

        editText.setFilters(new InputFilter[] { filter });

【讨论】:

  • 'InputFilter'能否与'TextWatcher'相冲突,我使用TextWatcher同时控制具有EditText长度的按钮状态,但使用InputFilterInputFilter 不起作用。
  • 我使用了相同的代码并且工作正常。请发布您的完整代码
  • 我发现了问题,过滤器在某个地方被重置了。
  • @twlkyao 很高兴看到您的问题得到解决。干杯
【解决方案2】:

你试过xml方式吗?它看起来像这样

<EditText 
  android:id="@+id/editText"
  android:inputType="text" 
  android:digits="0,1,2,3,4,5,6,7,8,9,*,qwertzuiopasdfghjklyxcvbnm" 
  android:hint="Only letters and numbers allowed.."
/>

【讨论】:

  • 这个方法没有反馈。
  • 不过有提示。你在寻找什么样的反馈?祝酒消息?
  • 这太棒了。我很确定如果您输入例如电话,那么如果只有数字和 - 工作或类似的东西,那是很明显的。无需反馈。
  • 逗号“,”不是必需的。你可以写android:digits="0123456789*qwertzuiopasdfghjklyxcvbnm"
  • @ĜüptåŠhãsĥwæt 试试这个:android:digits="0123456789abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ"
【解决方案3】:

适用于所有 Android 版本:

public static InputFilter getOnlyCharactersFilter() {
    return getCustomInputFilter(true, false, false);
}

public static InputFilter getCharactersAndDigitsFilter() {
    return getCustomInputFilter(true, true, false);
}

public static InputFilter getCustomInputFilter(final boolean allowCharacters, final boolean allowDigits, final boolean allowSpaceChar) {
    return new InputFilter() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            boolean keepOriginal = true;
            StringBuilder sb = new StringBuilder(end - start);
            for (int i = start; i < end; i++) {
                char c = source.charAt(i);
                if (isCharAllowed(c)) {
                    sb.append(c);
                } else {
                    keepOriginal = false;
                }
            }
            if (keepOriginal) {
                return null;
            } else {
                if (source instanceof Spanned) {
                    SpannableString sp = new SpannableString(sb);
                    TextUtils.copySpansFrom((Spanned) source, start, sb.length(), null, sp, 0);
                    return sp;
                } else {
                    return sb;
                }
            }
        }

        private boolean isCharAllowed(char c) {
            if (Character.isLetter(c) && allowCharacters) {
                return true;
            }
            if (Character.isDigit(c) && allowDigits) {
                return true;
            }
            if (Character.isSpaceChar(c) && allowSpaceChar) {
                return true;
            }
            return false;
        }
    };
}

现在你可以像这样使用这个文件管理器:

 //Accept Characters Only
edit_text.setFilters(new InputFilter[]{getOnlyCharactersFilter()});

//Accept Digits and Characters
edit_text.setFilters(new InputFilter[]{getCharactersAndDigitsFilter()});

//Accept Digits and Characters and SpaceBar
edit_text.setFilters(new InputFilter[]{getCustomInputFilter(true,true,true)});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 2019-08-08
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多