使用输入过滤器在 EditText android 中阻止数字
Block numeric in EditText android using input filter
我想通过不在 xml 中的输入过滤器以编程方式执行此操作,例如 - android:digits="aA".
这是我的代码
public static void RemoveCharacter(EditText text, String character, int length) {
final String blockCharacterSet = character;
// final String blockCharacterSet = "\"+[]&~#^|$%*!@/()-'\\":;,?{}=!$^';,?×÷<>{}€£¥₩%~`¤♡♥_|《》¡¿°•○●□■◇◆♧♣▲▼▶◀↑↓←→☆★▪:-);-):-D:-(:'(:O\";
InputFilter[] filter1 = new InputFilter[2];
filter1[0] = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
if (source != null && blockCharacterSet.contains(("" + source))) {
return "";
}
return null;
}
};
filter1[1] = new InputFilter.LengthFilter(length);
text.setFilters(filter1);
}
它完全适用于 Moto G、nexus 设备,但不适用于三星设备。
尝试使用以下代码添加您选择的输入类型,它将起作用:
your_editText.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);
好吧,如果你真的想用 InputFilter
来做,它会比那复杂一点。
不同的键盘有很大不同,所以我猜你的解决方案不适用于 Swype/Swift 键盘。
可能尝试使用这样的东西:
final Set<Character> blockSet = new HashSet<>();
blockSet.addAll(Arrays.asList('1', '2', '3', '4','5', '6', '7', '8', '9', '0'));
InputFilter filter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
if (Character.isDigit(source.charAt(i))) {
char[] v = new char[end - start];
TextUtils.getChars(source, start, end, v, 0);
String s = new String(v);
if (source instanceof Spanned) {
CharSequence sp = new SpannableString(s);
TextUtils.copySpansFrom((Spanned) source,
start, end, null, (Spannable) sp, 0);
boolean containsDigit = true;
while (containsDigit) {
containsDigit = false;
for (int j = 0; j < sp.length(); j++) {
if (blockSet.contains(sp.charAt(j))) {
sp = TextUtils.concat(sp.subSequence(0, j), sp.subSequence(j + 1, sp.length()));
containsDigit = true;
break;
}
}
}
return sp;
} else {
s = s.replaceAll("\d", "");
return s;
}
}
}
return null; // keep original
}
};
我想通过不在 xml 中的输入过滤器以编程方式执行此操作,例如 - android:digits="aA".
这是我的代码
public static void RemoveCharacter(EditText text, String character, int length) {
final String blockCharacterSet = character;
// final String blockCharacterSet = "\"+[]&~#^|$%*!@/()-'\\":;,?{}=!$^';,?×÷<>{}€£¥₩%~`¤♡♥_|《》¡¿°•○●□■◇◆♧♣▲▼▶◀↑↓←→☆★▪:-);-):-D:-(:'(:O\";
InputFilter[] filter1 = new InputFilter[2];
filter1[0] = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
if (source != null && blockCharacterSet.contains(("" + source))) {
return "";
}
return null;
}
};
filter1[1] = new InputFilter.LengthFilter(length);
text.setFilters(filter1);
}
它完全适用于 Moto G、nexus 设备,但不适用于三星设备。
尝试使用以下代码添加您选择的输入类型,它将起作用:
your_editText.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);
好吧,如果你真的想用 InputFilter
来做,它会比那复杂一点。
不同的键盘有很大不同,所以我猜你的解决方案不适用于 Swype/Swift 键盘。
可能尝试使用这样的东西:
final Set<Character> blockSet = new HashSet<>();
blockSet.addAll(Arrays.asList('1', '2', '3', '4','5', '6', '7', '8', '9', '0'));
InputFilter filter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
if (Character.isDigit(source.charAt(i))) {
char[] v = new char[end - start];
TextUtils.getChars(source, start, end, v, 0);
String s = new String(v);
if (source instanceof Spanned) {
CharSequence sp = new SpannableString(s);
TextUtils.copySpansFrom((Spanned) source,
start, end, null, (Spannable) sp, 0);
boolean containsDigit = true;
while (containsDigit) {
containsDigit = false;
for (int j = 0; j < sp.length(); j++) {
if (blockSet.contains(sp.charAt(j))) {
sp = TextUtils.concat(sp.subSequence(0, j), sp.subSequence(j + 1, sp.length()));
containsDigit = true;
break;
}
}
}
return sp;
} else {
s = s.replaceAll("\d", "");
return s;
}
}
}
return null; // keep original
}
};