您的位置:首页 > 移动开发 > Android开发

手机输入格式化显示3-4-4

2016-08-30 14:54 134 查看
                     手机号格式化输入框 3-4-4

开发过程中总遇到显示手机号的需求,如果不加分隔符显示,看起来不太方便,也不美观,所以需求上总要加上分隔符。网上找了一些demo,但是总感觉不和自己心意,仔细想想这个功能应该挺简单的,就自己动手写了一个(懒癌晚期,决心改掉这个毛病)。

     一般需求都是186-0000-0000或者186 0000 0000 等3-4-4格式,无非是分隔符不同。那么需求就简单了,在输入3个数字和7个数字后自动给输入框加上分隔符(以“-”为例)即可,那么只需要监听EditText,利用TextWatcher来监听。

    好了,思路有了,下面开始动手:自定义一个PhoneEditText继承EditText

/**
* Created   on 16/6/15.
*/
public class PhoneEditText extends EditText implements View.OnFocusChangeListener {
private int lastLength = 0;
private TextWatcher mTextWatcher;


      实现它的构造方法

public PhoneEditText(Context context) {
this(context, null);
}

public PhoneEditText(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.editTextStyle); // Attention here !
}

public PhoneEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);

final TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.PhoneEditText);
String dividerString = typedArray.getString(R.styleable.PhoneEditText_dividerString);
if (dividerString != null && dividerString.length() > 0){
divider = dividerString;
}
typedArray.recycle();
initContent();
}


            然后自定义一个TextWatcher

mTextWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(hasFoucs){
setClearIconVisible(s.length() > 0);
}
}

@Override
public void afterTextChanged(Editable s) {
if (s.length() < lastLength){
lastLength = s.length();
return;
}
//防止进入死循环
removeTextChangedListener(mTextWatcher);
String text = getText().toString().trim();
if (text.contains(divider)){//删除已添加的divider
String[] ses = text.split(divider);
for (int j = 0; j< ses.length -1;j++){
int length = 0;
for (int k = 0; k <= j;k++){
length = length + ses[k].length();
}
s.delete(length,length + divider.length());
}
}
if (s.length() > 3){//插入divider
s.insert(3,divider);
<
4000
span style="color:#cc7832;">        }
if (s.length() > (7 + divider.length())){
s.insert((7 + divider.length()),divider);
}
if (s.length() > (11 + divider.length()*2)){//删除最后添加的divider
s.delete((11 + divider.length()*2),getText().length());
}

lastLength = s.length();
addTextChangedListener(mTextWatcher);
}
};


   获取到输入的字符串,然后拼接上divider,这里会有一个问题,如果用户顺序输入没什么问题,加入用户中间输错了一个数字,会从中间修改,此时不能单纯只在最后添加divider,而是,每次都吧分隔符去掉,根据当前输入的数字长度进行格式化添加。

  这里还有一点,我在afterTextChanged(Editalbe s)方法里先调用

removeTextChangedListener(mTextWatcher);


 处理结束后有添加了监听

addTextChangedListener(mTextWatcher);


 是因为在afterTextChanged方法里面操作Editable s时会继续出发afterTextChanged方法,如此便进入死循环了,所以要先移除textWatcher,操作完成后再添加textWatcher。

   还有一点比较蛋疼的地方,手机号格式化显示是给用户方便看到,但是提交给服务器时就不需要添加这些分隔符了,所以在获取手机号时需要去掉分隔符,  

/**
*
*/
public String getTextString(){
return getText().toString().replace(divider,"");
}


  写到这里应该差不多了,然后我的项目中还有个一键删除输入文本的功能我也一并放到了demo中。

 第一次写博客,感觉写的还是比较乱的, 但是我相信我会做的越来越好的,算是自己的一个突破吧,哈哈。




demo下载地址:https://github.com/weiweiyixiao00/PhoneEditText
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息