【问题标题】:How to restrict TextView to allow only alpha-numeric characters in Android如何限制 TextView 在 Android 中仅允许使用字母数字字符
【发布时间】:2011-05-21 16:01:14
【问题描述】:

我的应用中有一个 TextView,我希望用户只能在其中输入字母数字字符。如何做到这一点?谢谢!

【问题讨论】:

    标签: android validation textview


    【解决方案1】:

    在 XML 中,这样写:

    android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "
    

    【讨论】:

    • 哇,Android 让这一切变得如此简单。 iOS 需要 1000 倍的努力才能实现相同的功能。
    • 我将此方法用于字母数字 android:digits="abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ" 但三星 Galaxy y pro 遇到了问题,它不允许使用大写字符(E、R、T、D、F、G、X、 C,V) 有数字。
    • 这个解决方案不会仅限于英语吗? You could use something like @string/digits for this,但这似乎是每种语言都必须做的主要麻烦。
    【解决方案2】:

    这里有一个更好的解决方案.........https://groups.google.com/forum/?fromgroups=#!topic/android-developers/hS9Xj3zFwZA

    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))) { 
                                    return ""; 
                            } 
                    } 
                    return null; 
            } 
    }; 
    
    edit.setFilters(new InputFilter[]{filter});
    

    【讨论】:

    • 通过允许大写字母更好的解决方案。
    • 此解决方案适用于输入单个字符的简单情况,但不能正确处理复制和粘贴,或者在EditText 上设置了其他InputFilters。我已经发布了一个更完整的解决方案。
    【解决方案3】:

    InputFilter 解决方案效果很好,让您可以完全控制以比android:digits 更精细的粒度级别过滤输入。如果所有字符都有效,filter() 方法应返回 null,如果某些字符无效,则应返回仅包含有效字符的 CharSequence。如果复制并粘贴了多个字符,其中一些字符无效,则应仅保留有效字符(如果任何字符无效,@AchJ 的解决方案将拒绝整个粘贴)。

    public static class AlphaNumericInputFilter implements InputFilter {
        public CharSequence filter(CharSequence source, int start, int end,
                Spanned dest, int dstart, int dend) {
    
            // Only keep characters that are alphanumeric
            StringBuilder builder = new StringBuilder();
            for (int i = start; i < end; i++) {
                char c = source.charAt(i);
                if (Character.isLetterOrDigit(c)) {
                    builder.append(c);
                }
            }
    
            // If all characters are valid, return null, otherwise only return the filtered characters
            boolean allCharactersValid = (builder.length() == end - start);
            return allCharactersValid ? null : builder.toString();
        }
    }
    

    另外,在设置InputFilter 时,必须确保不要覆盖EditText 上设置的其他InputFilters;这些可以在 XML 中设置,例如android:maxLength。您还必须考虑设置InputFilters 的顺序。当与长度过滤器结合使用时,您的自定义过滤器应插入长度过滤器之前,这样粘贴的文本将在长度过滤器之前应用自定义过滤器(@AchJ 的解决方案将覆盖所有其他 InputFilters 并仅应用自定义过滤器) .

        // Apply the filters to control the input (alphanumeric)
        ArrayList<InputFilter> curInputFilters = new ArrayList<InputFilter>(Arrays.asList(editText.getFilters()));
        curInputFilters.add(0, new AlphaNumericInputFilter());
        InputFilter[] newInputFilters = curInputFilters.toArray(new InputFilter[curInputFilters.size()]);
        editText.setFilters(newInputFilters);
    

    【讨论】:

    • 简化我要做的 setFilters:editText.setFilters(new InputFilter[]{new CurrencyFormatInputFilter()});
    • @Rocel 请仔细阅读我的解释:“您必须确保不要覆盖在您的 EditText 上设置的其他 InputFilters;这些可以在 XML 中设置,例如 android:maxLength " 您的建议会覆盖任何其他 InputFilter,就像 @AchJ 的解决方案一样,这不是我们想要在这里做的。
    【解决方案4】:

    这应该可行:

    textView.setInputType(InputType.TYPE_CLASS_NUMBER);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多