前言:需求来了,产品小姐姐展现其高超技能的时候到了,接下来就是闪(粉)亮(墨)登场的时候了,a.登录账号只能输入数字;b.限制下位数;c.密码只输入数字字母和标点符号,总不能输入汉字吧;d.还有那个哪里哪里 你就输入汉字和字母就行了,哪有人的名字有数字啊?e.最重要的是不能输入表情符号等等。针对多才多艺的产品小姐姐,我一个彪形大汉(会写代码的文艺青年)肯定会怜香惜玉一一满足。针对这一有规律的需求,决定自定义View重写EditText来实现之。
项目背景
不想说
需求
- 限制输入表情符号
- 限制输入字数限制
- 英文、汉字、数字等可以多个并存限制字数和输入类型
实现思路
自定义View继承EditText,通过自定义属性来设置过滤器Filter控制输入类型和个数的限制。废话不多说直接上代码:
自定义属性如下:
<declare-styleable name="HandyEmojiEdittext">
<!-- 是否限制输入表情符号 默认限制 -->
<attr name="emojiFilterable" format="boolean|reference" />
<!-- 是否过滤空格 默认不过滤 -->
<attr name="filterSpace" format="boolean|reference" />
<!-- 输入长度 -->
<attr name="inputLength" format="integer|reference" />
<!-- 输入类型 -->
<attr name="inputTypeEnum">
<flag name="none" value="0x00" /><!--0000 0000-->
<flag name="en" value="0x01" /><!--0000 0001-->
<flag name="zh" value="0x02" /><!--0000 0010-->
<flag name="num" value="0x04" /><!--0000 0100-->
</attr>
<!-- 输入的最大整数 -->
<attr name="maxNum" format="integer|reference" />
</declare-styleable>
需要注意的是,inputTypeEnum 输入类型限制设置属性值的时候 跟TextView android:gravity="start|end" 使用规则一样,eg:app:inputTypeEnum="en|zh" 所以value只能是2^n
属性inputTypeEnum解释
算了~不解释了 ~
自己看~很简单的~
inputTypeEnum = typedArray.getInt(R.styleable.HandyEmojiEdittext_inputTypeEnum, 0);
switch (inputTypeEnum) {
case 0://none
inputTypeFilter = null;
break;
case 1://en
inputTypeFilter = new InputFilter() {
Pattern inputTypePattern = Pattern.compile(
"[a-zA-Z]",
Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
Matcher inputTypeMather = inputTypePattern.matcher(source);
if (inputTypeMather.find()) {
return source;
}
return "";
}
};
break;
case 2://zh
inputTypeFilter = new InputFilter() {
Pattern inputTypePattern = Pattern.compile(
"[\u4e00-\u9fa5]",
Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
Matcher inputTypeMather = inputTypePattern.matcher(source);
if (inputTypeMather.find()) {
return source;
}
return "";
}
};
break;
case 3://en & zh
inputTypeFilter = new InputFilter() {
Pattern inputTypePattern = Pattern.compile(
"[a-zA-Z|\u4e00-\u9fa5]",
Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
@Override