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

原创 2016年08月30日 14:54:18

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












相关文章推荐

输入手机号码自动填充空格 变成3-4-4格式

电话号码3-4-4格式实现方式在最近的开发中遇到将电话号码展示成3-4-4格式的需求(如:132 2222 3333这样子),乍一看这个要求挺简单的,因为只需要在满足长度的字符串固定位置加上相应的空格...

小马哥----高仿移动定制版LTE4G yk858 H3H型号 6571芯片手机详细拆机主板图与开机界面图

yk858版本多 有个别的版本没办法使用常规方法root手机 此次展示的是移动定制版电池仓标贴 机型     主板标示贴为H3H  芯片为6571  此机型常规方法root不了 此机真实108...

Android (4-3)手機透過藍牙接收 Arduino 類比腳位狀態

本篇將教導大家如何使用手機讀取Arduino上類比腳位的數值,在此我們接上的是旋鈕式可變電阻。實際上當然不只可變電阻,所有的類比式感測器都可以這樣來使用!...
  • zgc261
  • zgc261
  • 2014年04月05日 23:10
  • 3239

V3手机驱动程序 4/6 (共6个压缩包)

  • 2008年04月06日 00:34
  • 9.54MB
  • 下载

输入一个四位数,显示出各个位上的数字。例如输入1234,程序可以显示出千位数字为1,百位数字为2,十位数字为3,个位数字为4。

unit Unit2; //类似于程序单元首部,由保留字Unit加单元名组成,同一个工程中单元名是唯一的 interface // (用于定义) Interface部分称为接口部分,用于...

手机视频3GP制作MP4转换软件

  • 2012年03月08日 12:57
  • 4.2MB
  • 下载

小米手机3,小米手机4 官方移动稳定版最新 ROM V6.7.1.0.KXDCNCH

小米手机3,小米手机4 官方移动稳定版最新 ROM V6.7.1.0.KXDCNCH 下载地址:   小米3   卡刷移动官方稳定版   小米4   卡刷移动官方稳定版 本次版本更新如下: ...
  • gbk188
  • gbk188
  • 2015年09月28日 17:00
  • 1629
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:手机输入格式化显示3-4-4
举报原因:
原因补充:

(最多只允许输入30个字)