在项目中可能会有许多需要输入手机号码、银行卡号或者身份证号等内容的输入框。如果直接输入的话将会是一堆号码堆在一起,第一是不太美观,第二也容易出错,用户体验不太好。但是若将输入的号码按特定格式进行分割将会大大提高用户体验!
以下是对常用的号码进行简单封装的自定义输入框控件,方便我们在开发过程中使用:
- 该控件支持
xml
属性指定,也支持代码指定; - 该控件支持类型分别为电话号码
(000 0000 0000)
、银行卡号(0000 0000 0000 0000 000)
和身份证号(000000 0000 0000 0000)
。
效果图
自定义EditText
/**
* @Description 分割输入框
* @Author 一花一世界
*/
public class ContentWithSpaceEditText extends EditText {
public static final int TYPE_PHONE = 0;
public static final int TYPE_CARD = 1;
public static final int TYPE_IDCARD = 2;
private int maxLength = 100;
private int contentType;
private int start, count, before;
private String digits;
public ContentWithSpaceEditText(Context context) {
this(context, null);
}
public ContentWithSpaceEditText(Context context, AttributeSet attrs) {
super(context, attrs);
parseAttributeSet(context, attrs);
}
public ContentWithSpaceEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
parseAttributeSet(context, attrs);
}
private void parseAttributeSet(Context context, AttributeSet attrs) {
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ContentWithSpaceEditText, 0, 0);
contentType = ta.getInt(R.styleable.ContentWithSpaceEditText_type, 0);
ta.recycle();
initType();
setSingleLine();
addTextChangedListener(watcher);
}
private void initType() {
if (contentType == TYPE_PHONE) {
maxLength = 13;
digits = "0123456789 ";
setInputType(InputType.TYPE_CLASS_NUMBER);
} else if (contentType == TYPE_CARD) {
maxLength = 23;
digits = "0123456789 ";
setInputType(InputType.TYPE_CLASS_NUMBER);
} else if (contentType == TYPE_IDCARD) {
maxLength = 21;
digits = "0123456789xX ";
setInputType(InputType.TYPE_CLASS_TEXT);
}
setFilters(new InputFilter[]{
new InputFilter.LengthFilter(maxLength)});
}
@Override
public void setInputType(int type) {
super.setInputType(type);
// setKeyListener要在setInputType后面调用,否则无效
if (!TextUtils.isEmpty(digits)) {
setKeyListener(DigitsKeyListener.getInstance(digits));
}
}
private TextWatcher watcher = new