我想只允许用户根据我的Android应用程序中的正则表达式键入某些字符。我如何实现它?
答案 0 :(得分:11)
使用TextWatcher
作为@Matt Ball建议。
@Override
public void afterTextChanged(Editable s) {
String text = s.toString();
int length = text.length();
if(length > 0 && !Pattern.matches(PATTERN, text)) {
s.delete(length - 1, length);
}
}
修改强>
尽管TextWatcher
有效,但使用InputFilter
会更清晰。请检查此example。
答案 1 :(得分:1)
试试这个:如果要键入的字符匹配/ [a-zA-Z0-9 {在此处插入有效字符}] /然后允许它,否则不要。
答案 2 :(得分:1)
您可以在xml EditText上使用android:digits
而不是使用正则表达式。
对于正则表达式的允许字符(数字,逗号和加号):
android:digits="0123456789,+"
如果您想重复使用它,可以将字符串资源用作数字值。
答案 3 :(得分:0)
您可以使用IntentFilter
进行高级过滤:
class CustomInputFilter : InputFilter {
private val regex = Pattern.compile("^[A-Z0-9]*$")
override fun filter(
source: CharSequence,
start: Int,
end: Int,
dest: Spanned?,
dstart: Int,
dend: Int
): CharSequence? {
val matcher = regex.matcher(source)
return if (matcher.find()) {
null
} else {
""
}
}
}
然后将其添加到EditText
或TextInputEditText
中,如下所示:
textInputLayout.editText!!.filters += CustomInputFilter()
//or
editText.filters += CustomInputFilter()
请记住,如果您有TextWatcher
,这不会阻止TextWatcher
触发,则可以过滤掉那些事件,检查上一个和下一个文本值是否相同。
类似的东西:
//addTextChangedListener is an extension function available in core-ktx library
textInputLayout.editText!!.addTextChangedListener(afterTextChanged = { editable ->
val editTextValue = viewModel.editTextLiveData.value ?: ""
if (!editTextValue.equals(editable)) {
viewModel.updateEditTextValue(editable?.toString() ?: "")
}
})