如何限制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>
如果用户键入小写&#34; abcd&#34;,EditText
应自动显示大写&#34; ABCD&#34;无需将键盘限制为大写。
答案 0 :(得分:111)
在XML中,添加:
android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "
答案 1 :(得分:22)
如何限制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
另外,在设置InputFilters
时,您必须确保不要覆盖EditText
上设置的其他android:maxLength
;这些可以用XML设置,如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);
已经存在,因此应用我们的字母数字过滤器将保留所有字母数字文本,并将其转换为大写。
var object1 = {
"11": { "id": 11, "parent_product": 0, "product_name": "WebStore", "product_price_city": null, "child": { "12": { "id": 12, "parent_product": 11, "product_name": "WebStore - Single", "product_price_city": 500 },
"13": { "id": 13, "parent_product": 11, "product_name": "WebStore - Full", "product_price_city": 2500 } } },
"15": { "id": 15, "parent_product": 0, "product_name": "WebStore", "product_price_city": null, "child": undefined },
"17": { "id": 17, "parent_product": 0, "product_name": "WebStore", "product_price_city": null }
},
key;
function getParent(id, object) {
var k;
Object.keys(object).some(function (a) {
if (object[a].child && id in object[a].child) {
k = a;
return true;
}
});
return k;
}
document.write(getParent('12', object1) + '<br>'); // '11'
key = getParent('42', object1);
if (typeof key === 'undefined') {
document.write('no key found');
}
答案 2 :(得分:10)
如果你不想要太多的自定义,一个简单的技巧实际上来自上面的一个,你要在android中添加所有字符:数字
android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
这应该可以使用Caps&amp; amp;小写字母。
答案 3 :(得分:8)
使用此:
android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
android:inputType="textCapCharacters"
我尝试使用textAllCaps="true"
按照此问题的已接受答案的评论中的建议,但它没有按预期工作。
答案 4 :(得分:4)
试试这个:
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 "";
}
}
});
}
答案 5 :(得分:4)
您不想为此编写任何正则表达式,只需将XML属性添加到“编辑”文本
即可android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
android:inputType="textCapCharacters"
经过测试,完美适用于PAN卡验证。
答案 6 :(得分:2)
极简主义的科特林方法:
fun EditText.allowOnlyAlphaNumericCharacters() {
filters = filters.plus(
listOf(
InputFilter { s, _, _, _, _, _->
s.replace(Regex("[^A-Za-z0-9]"), "")
},
InputFilter.AllCaps()
)
)
}
答案 7 :(得分:1)
为此你需要创建自定义过滤器并像这样设置为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文件中设置其他参数。
答案 8 :(得分:1)
这对我有用:
android:inputType="textVisiblePassword"
答案 9 :(得分:1)
以编程方式执行此操作:
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)
设置时,其中许多都表现得很奇怪。使用此设置,它会从输入文本中删除一个字符。此代码也解决了这个问题。
答案 10 :(得分:0)
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="PromoCode"
android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,_,-"
android:inputType="text" />
答案 11 :(得分:0)
我尝试了@methodSignature 的解决方案,但正如@Aba 所提到的,它生成了重复/奇怪的字符串。所以修改了一下。
科特林:
fun EditText.allowOnlyAlphaNumericCharacters() {
filters = arrayOf(
InputFilter { src, start, end, dst, dstart, dend ->
if (src.toString().matches(Regex("[a-zA-Z 0-9]+"))) {
src
} else ""
}
)
}
答案 12 :(得分:-1)
一行回答
XML添加此textAllCaps =“true”
在onCreate()
上执行此操作适用于小写&amp;允许空格的大写
yourEditText.setKeyListener(DigitsKeyListener.getInstance("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 "));
允许空格的小写 (此问题的必填答案)
yourEditText.setKeyListener(DigitsKeyListener.getInstance("abcdefghijklmnopqrstuvwxyz1234567890 "));
允许空格的大写
yourEditText.setKeyListener(DigitsKeyListener.getInstance("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 "));
答案 13 :(得分:-1)
private static final int MAX_LENGTH =13;
et_ScanLotBrCode.setFilters(new InputFilter[]{new InputFilter.AllCaps(),new InputFilter.LengthFilter(MAX_LENGTH) })
;
将上述代码添加到活动或片段中,使用它可以管理输入和大写字母的长度。