概述
常用方式:
1.设置inputType
2.设置digits
3.设置InputFilter过滤器
4.自定义EidtText,重写InputConnectionWrapper下的commitText()方法
5.监听TextWatcher
1.设置inputType
inputType可以在XML中设置,也可以通关Java代码设置。例,只允许输入数字:
//xml
android:inputType="number"
//Java
mEtMobile.setInputType(InputType.TYPE_CLASS_NUMBER)
inputType其它常用输入类型
android:inputType="textPassword"//密码
android:inputType="textVisiblePassword"//可见密码
android:inputType="phone"//拨号键盘
android:inputType="numberDecimal"//带小数点的浮点格式
...
2.digits
通过digits把允许输入的内容罗列出来,digits既可以在xml中设置,也可以再Java代码中设置。例,只允许输入数字和大写字母:
//xml
android:digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
//Java
editText.setKeyListener(DigitsKeyListener.getInstance("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
在Java代码中设置
3.InputFilter过滤器
注:设置InputFilter后,EditText内容无法通关setText(str)填写其它类型数据。如,设置为只允许汉字,则“editText.setText(“abc”)”无效
/**
* 只允许输入中文
* 问题1:无法通关setText("xxx")设置汉字以外的字符类型
* @param maxLength 最大输入长度,为0时不限制
* */
fun EditText.setFilterChinese(maxLength: Int = 0) {
val filter = object : InputFilter.LengthFilter(maxLength) {
override fun filter(
source: CharSequence?, start: Int, end: Int, dest: Spanned?, dstart: Int, dend: Int
): CharSequence? {
//return null表示不做处理直接返回,return “”表示返回空字符串
if (source != null) {
return if (isChinese(source)) {
if (maxLength == 0) {
null
} else {
super.filter(source, start, end, dest, dstart, dend)
}
} else {
""
}
}
return null
}
}
filters = arrayOf(filter)
}
//EditText设置InputFilter
editText.setFilterChinese(10)
工具类:
/**
* 检查是否是汉字
* 正则表达式匹配汉字
* */
fun isChinese(str: CharSequence): Boolean {
//只允许汉字,正则表达式匹配出所有非汉字
val regEx = "[^u4E00-u9FA5]"
val p: Pattern = Pattern.compile(regEx)
val m: Matcher = p.matcher(str)
//m.find() 只要整个输入序列或者子序列有一个与模式匹配, 便返回true
//m.matchers() 尝试将整个输入序列与模式匹配, 只有从头到尾完全与模式匹配才返回true
return !m.find() && !m.matches()
}
4.自定义EidtText,重写commitText()方法
自定义EditText,重写onCreateInputConnection(EditorInfo outAttrs)方法
override fun onCreateInputConnection(outAttrs: EditorInfo?): InputConnection {
return ChineseInputConnection(super.onCreateInputConnection(outAttrs), false)
//
return super.onCreateInputConnection(outAttrs)
}
自定义InputConnectionWrapper,重写commitText()方法
override fun commitText(text: CharSequence?, newCursorPosition: Int): Boolean {
text?.let {
if(isChinese(text)){
return true
}
}
return super.commitText(text, newCursorPosition)
}
5.监听TextWatcher
mEditText.addTextChangedListener(object :TextWatcher{
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable?) {
//获取文本内容
val text = s?.toString() ?: ""
//文本内容是否改变
var isChange = false
//正则替换所有非汉字字符,得到新的文本
var newText = chineseFilter(text)
//如果新文本和旧文本不一致,表示发生改变
if (newText != text) {
isChange = true
}
//如果文本长度超出最大输入限制,截取文本
if (newText.length > mMaxInputLength) {
isChange = true
newText = newText.substring(0, mMaxInputLength)
}
if (isChange) {
//文本内容改变前移除监听
mEditText.removeTextChangedListener(this)
//如果文本改变,通关replace替换文本内容
s?.replace(0, s.length, newText)
//
mEditText.setSelection(newText.length)
//改变后添加监听
mEditText.addTextChangedListener(this)
}
}
})
最后
以上就是完美萝莉为你收集整理的EditText限制输入字符类型的几种方式的全部内容,希望文章能够帮你解决EditText限制输入字符类型的几种方式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复