2011-05-21 40 views

回答

50

在XML,把这个:

android:digits="abcdefghijklmnopqrstuvwxyz1234567890 " 
+0

谢谢,这就是我正在寻找! – 2011-05-21 16:28:50

+0

不错的答案。很感谢 – 2012-01-31 09:49:52

+1

哇,Android让它变得如此简单。 iOS需要1000倍的努力来实现相同的功能。 – Moe 2012-04-24 15:15:32

-9

这应该工作:

textView.setInputType(InputType.TYPE_CLASS_NUMBER); 
+0

这只允许数字 – richy 2012-05-15 02:59:21

15

这里是一个更好的解决方案......... 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}); 
+0

允许大写字母更好的解决方案。 – 2013-10-17 10:16:50

+0

该解决方案适用于输入单个字符的简单情况,但不能正确处理复制和粘贴,或者在EditText上设置了其他'InputFilters'。我发布了一个更完整的解决方案。 – 2015-12-22 15:40:12

5

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); 
+0

来简化setFilters我会做的: editText.setFilters(new InputFilter [] {new CurrencyFormatInputFilter()}); – Rocel 2016-01-27 11:37:14

+1

@Rocel请仔细阅读我的解释:“您必须确保不要覆盖EditText上设置的其他InputFilters;这些可以设置为XML,例如'android:maxLength'._”您的建议将覆盖任何其他'InputFilter',就像@ AchJ的解决方案,它不是*我们想在这里做的。 – 2016-01-27 14:01:27

+1

好吧,我读错了,然后,我的不好;) – Rocel 2016-01-27 15:47:33

相关问题