当用户输入手机号码时,有些应用为了界面更加优美,要求输入的手机号带上分隔符,一般为344型的手机号码,本文为封装了带分隔符的输入手机号码的自定义SeparatorPhoneEditText。

运行效果截图如下:

代码如下,注释在代码里:

import android.content.Context;
import android.support.v7.widget.AppCompatEditText;
import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.Log;/*** 带分隔符的手机号码的EditView*/
public class SeparatorPhoneEditView extends AppCompatEditText implements TextWatcher {private final int MAX_INPUT_LENGTH = 13;//允许最大输入长度为11+2,考虑两个占位符占的位数private final char SEPARATOR = ' ';//分隔符,一般为-或半角空格private StringBuilder mBuilder = new StringBuilder();private int mChangeCount;public SeparatorPhoneEditView(Context context, AttributeSet attrs) {super(context, attrs);init();}public SeparatorPhoneEditView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {requestFocus();//设置键盘输入模式setInputType(InputType.TYPE_CLASS_NUMBER);//设置最大输入长度setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_INPUT_LENGTH)});addTextChangedListener(this);}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {mChangeCount = count - before;}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void afterTextChanged(Editable s) {//当只有输入数字时才进行调整if (mChangeCount > 0 && !TextUtils.equals(s, mBuilder.toString())) {mBuilder.delete(0, mBuilder.length());//因为在setText会重置为0,所以要在setText前记录光标的位置int cursorIndex = getSelectionStart();int length = s.length();for (int i = 0; i < length; i++) {char c = s.charAt(i);if (c != SEPARATOR) {mBuilder.append(c);}if ((isSeparationPosition(mBuilder.length()))) {mBuilder.append(SEPARATOR);}}//可能会得到大于最大长度的字符串,将最后一个删除if (mBuilder.length() > MAX_INPUT_LENGTH) {mBuilder.delete(MAX_INPUT_LENGTH, mBuilder.length());}//计算光标的偏移量int offset = calculateOffset(s, cursorIndex);setText(mBuilder.toString());//光标位置,做最小值判断是为防止越界,也是为了调整光标位setSelection(Math.min(cursorIndex + offset, mBuilder.length()));}Log.i(SeparatorPhoneEditView.class.getSimpleName(), "getPhoneCode:" + getPhoneCode());}/*** 计算光标位之前需要的偏移量*/private int calculateOffset(Editable s, int cursorIndex) {int length = s.length();int offset = 0;//需要偏移的光标位数,负数表示向前调,正数表示向后偏移int adjustedLen = mBuilder.length();//调整后长度int minLen = adjustedLen > length ? length : adjustedLen;for (int i = 0; i < minLen; i++) {if (i > cursorIndex - 1)break;char c = s.charAt(i);char adjustedChar = mBuilder.charAt(i);//只需要考虑调整后字符类型不同的情况if (c == SEPARATOR && adjustedChar != SEPARATOR) {offset--;} else if (c != SEPARATOR && adjustedChar == SEPARATOR) {offset++;}}return offset;}/*** 是否分隔位置*/private boolean isSeparationPosition(int index) {final int NUMBER_FRONT = 3;//前面有几位数final int NUMBER_MIDDLE = 4;//中间有几位数final int SECOND_SEPARATOR_POSITION = NUMBER_FRONT + NUMBER_MIDDLE + 1;//第二个空位的位置return index == NUMBER_FRONT || index == SECOND_SEPARATOR_POSITION;}public String getPhoneCode() {Editable text = getText();return text == null ? null : text.toString().replace(String.valueOf(SEPARATOR), "");}
}

Android带分隔符的输入手机号码的EditText相关推荐

  1. C++ 带分隔符的输入

    方法一 通过重载getline函数 #include<bits/stdc++.h> using namespace std; int main(){string s;while(getli ...

  2. Android Studio基础输入文本框EditText

    Android Studio基础输入文本框EditText 接续上一节<Android Studio 基础按钮使用> 1.提示文本框.输入文本框,在布局xml编写 <EditText ...

  3. 文本输入编辑框 EditText

    目录 一.EditText简单介绍 二.EditText外观 1.隐藏EditTExt边框 2.自定义EditText边框 三.监听焦点变更事件 一.EditText简单介绍 编辑框 EditText ...

  4. android 带清除功能的输入框控件

    今天,看到一个很好的自定义输入框控件,于是记录一下. 效果很好: 一,自定义一个类,名为ClearEditText package com.example.clearedittext;import a ...

  5. Android 带清除功能的输入框控件EditTextWithDel

    记录下一个很实用的小控件EditTextWithDel,就是在Android系统的输入框右边加入一个小图标,点击小图标可以清除输入框里面的内容,由于Android原生EditText不具备此功能,所以 ...

  6. android textview点击部分,Android开发第二大控件,EditText的属性和使用方法

    EditText与TextView非常相似,它甚至与TextView 共用了绝大部分XML属性和方法.EditText与TextView的最大区别在于:EditText可以接受用户输入. 一.Edit ...

  7. Android 基础(二十四) EditText

    介绍 A text field allows the user to type text into your app. It can be either single line or multi-li ...

  8. 【java学习笔记-io流 文件读写和键盘读写】带缓存的输入/输出流和数据输入/输出流

    文章目录 字节流类 带缓存的输入/输出流 BufferedReader与BufferedWriter类 下面的例子程序演示了read()方法,从控制台读取字符直到用户键入"q": ...

  9. Android使用EditView输入框输入身份证时,自动补全身份证最后一位验证位

    Android使用EditView输入框输入身份证时,自动补全身份证最后一位验证位 下面直接贴出代码 //监听输入框文本长度,并自动补全身份证最后一位验证位 mEdit.addTextChangedL ...

最新文章

  1. HDU-1569 方格取数(2) 最小割最大流
  2. bash 的进站欢迎提示
  3. go语言map按照key,value进行排序
  4. 若川知乎高赞:有哪些必看的 JS 库?
  5. 卷积法求解系统的零状态响应_信号与系统复习(2013.6)
  6. Javascript 中的false、0、null、undefined和空字符串对象
  7. html设置长宽高代码_Jenkins CI 自动构建与 CSTAT 代码
  8. ERP实施--常见问题
  9. Zalo电脑版多开软件
  10. 实验5 振幅调制(集成乘法器幅度调制电路)
  11. Jmeter编码格式
  12. 网页制作大作业HTML+CSS制作静态网页----原神
  13. bootstrap-select 通过拼音搜索汉字下拉框方法
  14. 7-3 求最小码距(完整版) (10 分)
  15. p5js动漫角色临摹
  16. 脑机接口中的流形嵌入知识迁移学习
  17. P1478 陶陶摘苹果(升级版)(C++_贪心)
  18. 查询 IEEE 期刊往年影响因子以及趋势
  19. 电脑没有无线网卡如何联网
  20. hawk -- pacemaker web GUI

热门文章

  1. 饭谈:把海弄干的鱼在海干前爬上了陆地,把点点淘汰的人在淘汰前成为了测开...
  2. 【技术交流】CH340与CH341的常见问题解答
  3. 帮朋友处理一个excel的问题(我也学到了)
  4. nodejs 查看下载文件路径_QQ、迅雷、新浪等App下载文件保存路径以及隐藏文件提取...
  5. Android读取和申请其他应用的悬浮窗权限
  6. 蓝桥冲刺31天之第七天
  7. C#中数据库应用-身份证信息查询器
  8. wordpress伪静态如何支持中文(目前不支持分类目录中文)
  9. Android 手把手带你玩转自定义相机
  10. 郭金东旗下金浦集团再次荣登江苏民营企业百强榜单