如何限制 EditText 只接受字母数字字符

如何限制 EditText只接受字母数字字符,并且在 EditText中小写和大写字符都显示为大写?

<EditText
android:id="@+id/userInput"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textMultiLine"
android:minLines="3" >


<requestFocus />
</EditText>

如果用户键入小写字母“ ABCD”,EditText将自动显示大写字母“ ABCD”,而无需限制键盘为大写。

91968 次浏览

在 XML 中,添加以下内容:

 android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "

为此,您需要创建自定义 Filter 并像下面这样设置 EditText。

这将自动将您的字母转换为大写。

EditText editText = (EditText)findViewById(R.id.userInput);
InputFilter myFilter = new InputFilter() {


@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
try {
Character c = source.charAt(0);
if (Character.isLetter(c) || Character.isDigit(c)) {
return "" + Character.toUpperCase(c);
} else {
return "";
}
} catch (Exception e) {
}
return null;
}
};
editText.setFilters(new InputFilter[] { myFilter });

在 xml 文件中不需要设置其他参数。

一行答案

XML Add this textAllCaps = “ true”

这样做 onCreate ()

对于允许空格 的小写和大写

yourEditText.setKeyListener(DigitsKeyListener.getInstance("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 "));

对于小写允许空格 < strong > (此问题的必答)

yourEditText.setKeyListener(DigitsKeyListener.getInstance("abcdefghijklmnopqrstuvwxyz1234567890 "));

对于允许空格 的大写字母

yourEditText.setKeyListener(DigitsKeyListener.getInstance("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 "));

试试这个:

private void addFilterToUserName()
{


sign_up_display_name_et.setFilters(new InputFilter[] {
new InputFilter() {
public CharSequence filter(CharSequence src, int start,
int end, Spanned dst, int dstart, int dend) {
if(src.equals("")){ // for backspace
return src;
}
if(src.toString().matches("[a-zA-Z 0-9]+")){
return src;
}
return "";
}
}
});
}

如何限制 EditText 只接受字母数字字符,以便无论用户输入的是大小写键,EditText 都显示大写

InputFilter解决方案运行良好,并给予您完全的控制,以比 android:digits更细的粒度级别过滤掉输入。如果所有字符都有效,则 filter()方法应返回 null; 如果某些字符无效,则返回仅包含有效字符的 CharSequence。如果复制和粘贴了多个字符,其中一些无效,则只保留有效字符。

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; 这些 InputFilters可以用 XML 设置,如 android:maxLength。您还必须考虑设置 InputFilters的顺序,它们是按照这个顺序应用的。幸运的是,InputFilter.AllCaps已经存在,所以应用我们的字母数字过滤器将保留所有字母数字文本,并将其转换为大写。

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

这对我有用:

android:inputType="textVisiblePassword"

用这个:

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
android:inputType="textCapCharacters"

我尝试使用 textAllCaps="true"作为建议在一个接受的回答这个问题的评论,但它没有按照预期的工作。

如果你不想要太多的自定义,一个简单的技巧实际上是从上面的一个与所有字符你想要添加到 android: 数字

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"

这应该可以接受大写和小写字母的字母数字值。

您不需要为此编写任何正则表达式,只需将 XML 属性添加到 Edit 文本中即可

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
android:inputType="textCapCharacters"

测试工作完美的 PAN 卡验证。

通过编程方式执行以下操作:

mEditText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
mEditText.setFilters(new InputFilter[] {
new InputFilter() {
@Override
public CharSequence filter(CharSequence input, int start, int end, Spanned dst, int dstart, int dend) {
if (input.length() > 0 && !Character.isLetterOrDigit(input.charAt(0))) {
// if not alphanumeric, disregard the latest input
// by returning an empty string
return "";
}
return null;
}
}, new InputFilter.AllCaps()
});

请注意,对 setInputType的调用是必需的,这样我们就可以确保 input变量始终是用户给出的最后一个字符。

我已经尝试了在 SO 中讨论的其他解决方案。但他们中的许多人在某些情况下表现得很奇怪,比如当你有快速周期 (Tap space bar twice for period followed by space)设置。使用此设置,它将从输入文本中删除一个字符。这段代码也解决了这个问题。

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="PromoCode"
android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,_,-"
android:inputType="text" />

极简主义 Kotlin 方法:

fun EditText.allowOnlyAlphaNumericCharacters() {
filters = filters.plus(
listOf(
InputFilter { s, _, _, _, _, _->
s.replace(Regex("[^A-Za-z0-9]"), "")
},
InputFilter.AllCaps()
)
)
}
private static final int MAX_LENGTH =13;

et_ScanLotBrCode.setFilters(new InputFilter[]{new InputFilter.AllCaps(),new InputFilter.LengthFilter(MAX_LENGTH) });

将上面的代码添加到活动或片段中,使用这个可以管理输入的长度和大写字母。

我通过@方法签名尝试了这个解决方案,但正如@阿爸所提到的,它正在生成重复的/奇怪的字符串。

科特林:

fun EditText.allowOnlyAlphaNumericCharacters() {
filters = arrayOf(
InputFilter { src, start, end, dst, dstart, dend ->
if (src.toString().matches(Regex("[a-zA-Z 0-9]+"))) {
src
} else ""
}
)

}