我希望限制字符仅为0-9、小写字母a-z、大写字母A-Z和空格键。通过设置inputtype,我可以将其限制为数字,但是我无法通过查看文档找出使用Inputfilter的方法。
我希望限制字符仅为0-9、小写字母a-z、大写字母A-Z和空格键。通过设置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 });
InputFilter
在显示字典建议的Android版本中有点复杂。在source
参数中,有时会得到一个SpannableStringBuilder
,有时会得到一个普通的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();
}
}
}
String replacement = source.subSequence(start, end).toString(); return replacement.replaceAll("[^A-Za-z0-9_\\-@]", "");
- Splashsource instanceof SpannableStringBuilder
时,输入“_AB_”会得到“_AAB_”,就像尝试上一个答案一样。幸运的是,我能够通过使用下面@florian的解决方案来解决这个问题。 - Guillaume更加容易:
<EditText
android:inputType="text"
android:digits="0,1,2,3,4,5,6,7,8,9,*,qwertzuiopasdfghjklyxcvbnm" />
imeOptions="actionNext"
时可能无法正常工作。 - Pete Doyle所有发布的答案对我都没有用,我自己想出了解决办法:
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 });
EditText
已经可以拥有自己的过滤器,例如长度过滤器。因此,您最好不要仅仅覆盖这些过滤器,而是希望将您的过滤器添加到已有的过滤器中。 - Aleks N.使用此方法,它可以完美地满足您的需求,并且非常简单。
<EditText
android:inputType="textFilter"
android:digits="@string/myAlphaNumeric" />
在 strings.xml 文件中。<string name="myAlphaNumeric">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789</string>
为避免输入类型中的特殊字符
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;
}
};
您可以像下面这样为编辑文本设置过滤器
edtText.setFilters(new InputFilter[] { filter });
我已经做了类似这样的事情,以保持简单:
edit_text.filters = arrayOf(object : InputFilter {
override fun filter(
source: CharSequence?,
start: Int,
end: Int,
dest: Spanned?,
dstart: Int,
dend: Int
): CharSequence? {
return source?.subSequence(start, end)
?.replace(Regex("[^A-Za-z0-9 ]"), "")
}
})
我们通过将源字符串新部分中的所有不需要的字符替换为空字符串的方式来进行操作。
edit_text
变量是我们正在引用的EditText
对象。
该代码使用kotlin
编写。
TextWatcher
将会导致StackOverFlowError
:https://link.medium.com/YfjQwprHUhb - mochadwiInputFilter
可能与 TextWatcher
不兼容。如果它不能按预期工作(清除文本),请检查您是否添加了 TextWatcher
。InputFilter
将重置 maxLength
。要启用它,请使用 edit_text.filters = arrayOf(*aboveInputFilter*, InputFilter.LengthFilter(10))
。 - CoolMind首先在 strings.xml
文件中添加:
<string name="vin_code_mask">0123456789abcdefghjklmnprstuvwxyz</string>
XML:
android:digits="@string/vin_code_mask"
edit_text.filters += InputFilter { source, start, end, _, _, _ ->
val mask = getString(R.string.vin_code_mask)
for (i in start until end) {
if (!mask.contains(source[i])) {
return@InputFilter ""
}
}
null
}
奇怪的是,在模拟器的软键盘上运行起来很奇怪。
警告! 下面的代码将过滤所有字母和其他符号,只保留数字键盘用于软件键盘。仅支持数字键盘在智能手机上出现。
edit_text.keyListener = DigitsKeyListener.getInstance(context.getString(R.string.vin_code_mask))
我通常也会设置maxLength
、filters
和inputType
。
没错,最好的方法是在XML布局中使用以下代码来修复它:
<EditText
android:inputType="text"
android:digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" />
正如Florian Fröhlich所指出的那样,即使是对于文本视图,它也能很好地工作。
<TextView
android:inputType="text"
android:digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" />
小心提醒,android:digits
中提到的字符仅用于显示,因此请务必小心不要漏掉任何一组字符 :)
android:inputType="textCapCharacters"
作为<EditText>
的属性,以仅接受大写字母(和数字)。