关闭

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

标签: android手机号 格式化3-4-4手机号
56人阅读 评论(0) 收藏 举报
分类:

                     手机号格式化输入框 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);
        }
        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












0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:56次
    • 积分:10
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档