手机输入格式化显示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
实现它的构造方法
然后自定义一个TextWatcher
获取到输入的字符串,然后拼接上divider,这里会有一个问题,如果用户顺序输入没什么问题,加入用户中间输错了一个数字,会从中间修改,此时不能单纯只在最后添加divider,而是,每次都吧分隔符去掉,根据当前输入的数字长度进行格式化添加。
这里还有一点,我在afterTextChanged(Editalbe s)方法里先调用
处理结束后有添加了监听
是因为在afterTextChanged方法里面操作Editable s时会继续出发afterTextChanged方法,如此便进入死循环了,所以要先移除textWatcher,操作完成后再添加textWatcher。
还有一点比较蛋疼的地方,手机号格式化显示是给用户方便看到,但是提交给服务器时就不需要添加这些分隔符了,所以在获取手机号时需要去掉分隔符,
写到这里应该差不多了,然后我的项目中还有个一键删除输入文本的功能我也一并放到了demo中。
第一次写博客,感觉写的还是比较乱的, 但是我相信我会做的越来越好的,算是自己的一个突破吧,哈哈。
demo下载地址:https://github.com/weiweiyixiao00/PhoneEditText
开发过程中总遇到显示手机号的需求,如果不加分隔符显示,看起来不太方便,也不美观,所以需求上总要加上分隔符。网上找了一些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
相关文章推荐
- 在PHP中显示格式化的用户输入
- JavaScript对INPUT输入的格式化显示 - 数字每隔3位加逗号
- PHP中显示格式化的用户输入
- 手机号码格式化显示自定义EditText控件
- 手机号码格式化;实现手机号344格式输入:000 0000 0000
- [Unity3D]手机3D游戏开发:如何实现最高分的存储与显示(五)----使用TextField 输入并调整排名
- php 银行卡号 手机号码 正则表达式格式化 每4位隔空格显示
- 文本框输入内容放大显示和格式化插件
- input只能输入数字,格式化数值的显示
- 【总结】DateTime日期类型格式化显示(转)以及判断输入文本框是否符合日期格式
- php 银行卡号 手机号码 正则表达式格式化 每4位隔空格显示
- jq控制输入手机号码格式显示为3-4-4
- 手机号码格式化输入工具 PhoneNumberFormatUtils
- JavaScript对INPUT输入的格式化显示 - 数字每隔3位加逗号
- android输入框EditText输入银行卡,输入手机,输入身份证格式化的实现
- PHP中显示格式化的用户输入
- [Unity3D]手机3D游戏开发:如何实现最高分的存储与显示(七)----使用Game ID避免数据重复输入
- react native输入框 输入金额等数据后如何格式化显示
- iOS 数字格式化(手机号码 银行卡号 格式化,验证码输入控制)
- 让Redhat Fedora Core release2英文环境+中文显示/输入