Android输入框格式化Edittexthelp(有项目可下载)
16lz
2021-01-23
下载代码
在Activity里面/************ 输入框-全局变量 *********************/ private SpaceTextWatcher[] asEditTexts = new SpaceTextWatcher[3]; private EditText[] editTexts = new EditText[3];///记得实例化editTexts[0] = etCardNum;//银行卡 editTexts[1] = etPhone;//手机号 editTexts[2] = etIdCardNo;//身份证 asEditTexts[0] = new SpaceTextWatcher(editTexts[0], 23); asEditTexts[0].setSpaceType(SpaceTextWatcher.SpaceType.bankCardNumberType); asEditTexts[1] = new SpaceTextWatcher(editTexts[1], 13); asEditTexts[1].setSpaceType(SpaceTextWatcher.SpaceType.mobilePhoneNumberType); asEditTexts[2] = new SpaceTextWatcher(editTexts[2], 21); asEditTexts[2].setSpaceType(SpaceTextWatcher.SpaceType.IDCardNumberType);/** * 添加空格的 TextWatcher * * @author wenwenzhang 0152 * @version [版本号, 2015年4月21日] * @see [相关类/方法] * @since [产品/模块版本] */public class SpaceTextWatcher implements TextWatcher { /** * 改变之前text空格数量 */ int spaceNumberA = 0; /** * text改变之前的长度 */ private int beforeTextLength = 0; private int onTextLength = 0; private boolean isChanged = false; private StringBuffer buffer = new StringBuffer(); private EditText editText; /** * text最大长度限制 */ private int maxLenght; private SpaceType spaceType; /** * 记录光标的位置 */ private int location = 0; /** * 是否是主动设置text */ private boolean isSetText = false; public SpaceTextWatcher(EditText editText, int maxLenght) { this.editText = editText; this.maxLenght = maxLenght; if (editText == null) { new NullPointerException("editText is null"); } spaceType = SpaceType.defaultType;// if(maxLenght==48){// spaceType = SpaceType.bankCardNumberType;// }else if(maxLenght==13){// spaceType = SpaceType.mobilePhoneNumberType;// }else if(maxLenght == 21){// spaceType = SpaceType.IDCardNumberType;// } editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter( maxLenght)}); editText.addTextChangedListener(this); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { beforeTextLength = s.length(); if (buffer.length() > 0) { buffer.delete(0, buffer.length()); } spaceNumberA = 0; for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == ' ') { spaceNumberA++; } } } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { onTextLength = s.length(); buffer.append(s.toString()); if (onTextLength == beforeTextLength || onTextLength > maxLenght || isChanged) { isChanged = false; return; } isChanged = true; } @Override public void afterTextChanged(Editable s) { if (isChanged) { location = editText.getSelectionEnd();// ToastUtils.showToastCenter("=="+editText.getSelectionEnd()); int index = 0; while (index < buffer.length()) { // 删掉所有空格 if (buffer.charAt(index) == ' ') { buffer.deleteCharAt(index); } else { index++; } } index = 0; int spaceNumberB = 0; while (index < buffer.length()) { // 插入所有空格 spaceNumberB = insertSpace(index, spaceNumberB); index++; } String str = buffer.toString(); // 下面是计算光位置的 if (spaceNumberB > spaceNumberA) {// ToastUtils.showToastCenter("插入空格了"); location += (spaceNumberB - spaceNumberA); spaceNumberA = spaceNumberB; } if (isSetText) {//ss location = str.length(); isSetText = false; } else if (location > str.length()) { location = str.length(); } else if (location < 0) { location = 0; } updateContext(s, str); isChanged = false; } } /** * 更新编辑框中的内容 * * @param editable * @param values */ private void updateContext(Editable editable, String values) { if (spaceType == SpaceType.IDCardNumberType||spaceType == SpaceType.mobilePhoneNumberType||spaceType == SpaceType.bankCardNumberType) { editable.replace(0, editable.length(), values); } else { editText.setText(values); try { editText.setSelection(location); } catch (Exception e) { e.printStackTrace(); } } } /** * 根据类型插入空格 * * @param index * @param spaceNumberAfter * @return * @see [类、类#方法、类#成员] */ private int insertSpace(int index, int spaceNumberAfter) { switch (spaceType) { case defaultType:// 相隔四位空格 if (index >= 4 && (index % (4 * (spaceNumberAfter + 1)) == spaceNumberAfter)) { buffer.insert(index, ' '); spaceNumberAfter++; } break; case bankCardNumberType: if (index >= 4 && (index % (4 * (spaceNumberAfter + 1)) == spaceNumberAfter)) { buffer.insert(index, ' '); spaceNumberAfter++; } break; case mobilePhoneNumberType: if (index == 3 || ((index > 7) && ((index - 3) % (4 * spaceNumberAfter) == spaceNumberAfter))) { buffer.insert(index, ' '); spaceNumberAfter++; } break; case IDCardNumberType: if (index == 6 || ((index > 10) && ((index - 6) % (4 * spaceNumberAfter) == spaceNumberAfter))) { buffer.insert(index, ' '); spaceNumberAfter++; } break; default: if (index > 3 && (index % (4 * (spaceNumberAfter + 1)) == spaceNumberAfter)) { buffer.insert(index, ' '); spaceNumberAfter++; } break; } return spaceNumberAfter; } /*** * 计算需要的空格数 * * @return 返回添加空格后的字符串长度 * @see [类、类#方法、类#成员] */ private int computeSpaceCount(CharSequence charSequence) { buffer.delete(0, buffer.length()); buffer.append(charSequence.toString()); int index = 0; int spaceNumberB = 0; while (index < buffer.length()) { // 插入所有空格 spaceNumberB = insertSpace(index, spaceNumberB); index++; } buffer.delete(0, buffer.length()); return index; } /** * 设置空格类型 * * @param spaceType * @see [类、类#方法、类#成员] */ public void setSpaceType(SpaceType spaceType) { this.spaceType = spaceType; if (this.spaceType == SpaceType.IDCardNumberType) { editText.setInputType(InputType.TYPE_CLASS_TEXT); }else if (this.spaceType == SpaceType.bankCardNumberType) { editText.setInputType(InputType.TYPE_CLASS_TEXT); }else if (this.spaceType == SpaceType.mobilePhoneNumberType) { editText.setInputType(InputType.TYPE_CLASS_PHONE); } } /** * 设置输入字符 * * @param charSequence * @return 返回设置成功失败 * @see [类、类#方法、类#成员] */ public boolean setText(CharSequence charSequence) { if (editText != null && !TextUtils.isEmpty(charSequence) && computeSpaceCount(charSequence) <= maxLenght) { isSetText = true; editText.removeTextChangedListener(this); editText.setText(charSequence); editText.addTextChangedListener(this); return true; } return false; } /** * 得到输入的字符串去空格后的字符串 * * @return * @see [类、类#方法、类#成员] */ public String getTextNotSpace() { if (editText != null) { return delSpace(editText.getText().toString()); } return null; } /** * 得到输入的字符串去空格后的长度 * * @return * @see [类、类#方法、类#成员] */ public int getLenghtNotSpace() { if (editText != null) { return getTextNotSpace().length(); } return 0; } /** * 得到空格数量 * * @return * @see [类、类#方法、类#成员] */ public int getSpaceCount() { return spaceNumberA; } /** * 去掉字符空格,换行符等 * * @param str * @return * @see [类、类#方法、类#成员] */ private String delSpace(String str) { if (str != null) { str = str.replaceAll("\r", ""); str = str.replaceAll("\n", ""); str = str.replace(" ", ""); } return str; } /** * 空格类型 * * @author 江钰锋 0152 * @version [版本号, 2015年4月21日] * @see [相关类/方法] * @since [产品/模块版本] */ public enum SpaceType { /** * 默认类型 */ defaultType, /** * 银行卡类型 */ bankCardNumberType, /** * 手机号类型 */ mobilePhoneNumberType, /** * 身份证类型 */ IDCardNumberType; }}
Android银行卡、手机号、身份证格式化。不支持从中间删除,如果有人愿意填坑,填完,麻烦联系我,感谢。下载代码
更多相关文章
- android中获取context的多种方法的区别(this,getbasecontext(),ge
- Android中去掉ActionBar的几种方法
- 反射的方法获取android的Imei
- Android 一些工具类/方法收藏
- Android编程心得---捕捉Home键事件的完美解决方法
- Android EditText过滤汉字的方法
- 显示Android当前可用系统内存方法
- Android Studio中添加自定义字体的方法
- Android Studio开发APP常用方法(一)