如何使用InputFilter限制Android中的EditText中的字符?

我只想将字符限制为0-9,az,AZ和空格键。 设置inputtype我可以限制到数字,但我无法弄清楚通过文档的Inputfilter的方式。

我在另一个论坛上发现了这个。 像冠军一样工作。

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

在显示字典build议的Android版本中,InputFilters有点复杂。 您有时会得到一个SpannableStringBuilder,有时在source参数中是一个纯String。

以下InputFilter应该工作。 随意改善这个代码!

 new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { if (source instanceof SpannableStringBuilder) { SpannableStringBuilder sourceAsSpannableBuilder = (SpannableStringBuilder)source; for (int i = end - 1; i >= start; i--) { char currentChar = source.charAt(i); if (!Character.isLetterOrDigit(currentChar) && !Character.isSpaceChar(currentChar)) { sourceAsSpannableBuilder.delete(i, i+1); } } return source; } else { StringBuilder filteredStringBuilder = new StringBuilder(); for (int i = start; i < end; i++) { char currentChar = source.charAt(i); if (Character.isLetterOrDigit(currentChar) || Character.isSpaceChar(currentChar)) { filteredStringBuilder.append(currentChar); } } return filteredStringBuilder.toString(); } } } 

更容易:

 <EditText android:inputType="text" android:digits="0,1,2,3,4,5,6,7,8,9,*,qwertzuiopasdfghjklyxcvbnm" /> 

没有发布的答案为我工作。 我带来了自己的解决scheme:

 InputFilter filter = 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)) // put your condition here 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) { return Character.isLetterOrDigit(c) || Character.isSpaceChar(c); } } editText.setFilters(new InputFilter[] { filter }); 

使用这个工作100%你的需要,非常简单。

 <EditText android:inputType="textFilter" android:digits="@string/myAlphaNumeric" /> 

在strings.xml中

 <string name="myAlphaNumeric">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789</string> 

避免inputtypes中的特殊字符

 public static InputFilter filter = new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { String blockCharacterSet = "~#^|$%*!@/()-'\":;,?{}=!$^';,?×÷<>{}€£¥₩%~`¤♡♥_|《》¡¿°•○●□■◇◆♧♣▲▼▶◀↑↓←→☆★▪:-);-):-D:-(:'(:O 1234567890"; if (source != null && blockCharacterSet.contains(("" + source))) { return ""; } return null; } }; 

你可以像下面一样设置filter到你的编辑文本

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

除了被接受的答案外,为了只接受大写字母(和数字),还可以使用例如: android:inputType="textCapCharacters"作为<EditText>一个属性。

出于某种原因,android.text.LoginFilter类的构造函数是包范围的,所以你不能直接扩展它(即使它和这段代码是一样的)。 但是你可以扩展LoginFilter.UsernameFilterGeneric! 那么你只是有这个:

 class ABCFilter extends LoginFilter.UsernameFilterGeneric { public UsernameFilter() { super(false); // false prevents not-allowed characters from being appended } @Override public boolean isAllowed(char c) { if ('A' <= c && c <= 'C') return true; if ('a' <= c && c <= 'c') return true; return false; } } 

这没有真正的logging,但它是核心库的一部分, 源代码很简单 。 我已经使用了一段时间了,到目前为止没有问题,虽然我承认我没有尝试过任何涉及spannables的复杂任务。

这是正确的,最好的方法去解决它在XML布局本身使用:

 <EditText android:inputType="text" android:digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" /> 

正如FlorianFröhlich所指出的那样,甚至对于文本视图也是非常有效的。

 <TextView android:inputType="text" android:digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" /> 

只要谨慎一点, android:digits提到的字符只会显示,所以只是要小心不要错过任何字符集:)

这个简单的解决scheme为我工作,当我需要防止用户input空string到EditText。 你当然可以添加更多的字符:

 InputFilter textFilter = new InputFilter() { @Override public CharSequence filter(CharSequence c, int arg1, int arg2, Spanned arg3, int arg4, int arg5) { StringBuilder sbText = new StringBuilder(c); String text = sbText.toString(); if (text.contains(" ")) { return ""; } return c; } }; private void setTextFilter(EditText editText) { editText.setFilters(new InputFilter[]{textFilter}); } 

如果你inheritanceInputFilter,你可以创build你自己的InputFilter来过滤掉任何非字母数字字符。

InputFilter接口有一个方法, filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) ,它提供了你需要知道哪些字符被input到EditText中的所有信息分配给。

一旦创build了自己的InputFilter,就可以通过调用setFilters(…)将其分配给EditText。

http://developer.android.com/reference/android/text/InputFilter.html#filter(java.lang.CharSequence,int,int,android.text.Spanned,int,int

忽略其他人处理的span文件,为了正确处理字典build议,我发现下面的代码有效。

随着build议的增长,源代码会不断增加,所以我们必须查看在返回任何内容之前它实际上期待我们replace多less个字符。

如果我们没有任何无效字符,则返回null,以便发生默认replace。

否则,我们需要从ACTUALLY要放入EditText的子string中提取出有效的字符。

 InputFilter filter = new InputFilter() { public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { boolean includesInvalidCharacter = false; StringBuilder stringBuilder = new StringBuilder(); int destLength = dend - dstart + 1; int adjustStart = source.length() - destLength; for(int i=start ; i<end ; i++) { char sourceChar = source.charAt(i); if(Character.isLetterOrDigit(sourceChar)) { if(i >= adjustStart) stringBuilder.append(sourceChar); } else includesInvalidCharacter = true; } return includesInvalidCharacter ? stringBuilder : null; } }; 

以防止在edittext中的文字。 创build一个你可以随时使用的类。

 public class Wordfilter implements InputFilter { @Override public CharSequence filter(CharSequence source, int start, int end,Spanned dest, int dstart, int dend) { // TODO Auto-generated method stub boolean append = false; String text = source.toString().substring(start, end); StringBuilder str = new StringBuilder(dest.toString()); if(dstart == str.length()) { append = true; str.append(text); } else str.replace(dstart, dend, text); if(str.toString().contains("aaaaaaaaaaaa/*the word here*/aaaaaaaa")) { if(append==true) return ""; else return dest.subSequence(dstart, dend); } return null; } } 

有可能使用setOnKeyListener 。 在这个方法中,我们可以自定义input的edittext

如果你想在你的input中包含空格,那么在android:digit代码中添加空格,如上所示。

即使在Android 4.0以上的版本,它工作正常。

请享用 :)