一、前言

对于移动端开发来讲,这种需求是很常见的,需要对手机号、银行卡号添加空格或者横线便于用户阅读,总体来说还是很简单的一个需求,实现起来说简单也简单,但是没选择正确的方法也是稍微有点麻烦的。为什么这么说呢,前几天浏览博客看到一篇文章实现了输入手机号添加空格,不过只考虑了末尾输入这一种情况,网上搜索了一下,大多数也是没有考虑所有的情况,中间插入、删除,复制等,所以如果用最常规的对输入的字符串输入后进行格式化,那么就需要考虑的是光标的位置,需要一定的耐心调试,本文采用另一种相对简单的方式来实现。

二、实现

对于 EditText 实现添加空格,实现这个需求肯定是要调用 addTextChangedListener 这个接口,监听输入的变化情况。最开始我是使用对输入后的字符串进行格式化,但是就是针对每种情况设置光标的位置比较麻烦,我也尝试了写出来了,不过就是处理复制任意长的字符串光标不好精确设置。我后面发现通过 Editable 来插入、删除等是不需要考虑光标的, 关于 EditTable 可以参照这篇文章 TextView源码解析 。那么实现就相对简单很多,话不多说看代码:

private static final char space = ' '; //也可以是'-'editText.addTextChangedListener(new MyTextWatch());private class MyTextWatch implements TextWatcher {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {format(s);}}
private void format(Editable s) {if (s.length() < 4) return;editText.removeTextChangedListener(this);int p = 0;while (p < text.length()) {if (text.charAt(p) == space) {text.delete(p, p + 1);} else {p++;}}int length = s.length();if (length > 7) {s.insert(3, String.valueOf(space));if (editText.getSelectionStart() == 4) {editText.setSelection(3);}s.insert(8, String.valueOf(space));if (editText.getSelectionStart() == 9) {editText.setSelection(8);}} else if (length > 3) {s.insert(3, String.valueOf(space));if (editText.getSelectionStart() == 4) {editText.setSelection(3);}}editText.addTextChangedListener(this);}

然后为了防止 Editable 的删除 、插入操作调用监听进入死循环,我们可以先移除监听,然后完成相关操作后果再添加。上述做法也是先对输入的字符串进行去除空格进行111 1111 1111这种格式进行格式化,不过这种还是需要处理光标的问题,因为你刚好中间输入或者删除,后面一位是空格并且字符串去掉空格长度过后大于3的话,光标插入就自动在空格后面而不在字符串后面,删除呢就不能删除中间的空格,删除了一位空格又马上插入了一个空格,显然是不对的。
所以我们上述代码做了如下处理:

if (editText.getSelectionStart() == 4) {editText.setSelection(3);}if (editText.getSelectionStart() == 9) {editText.setSelection(8);}

只要光标在空格后面就自动移到字符串的后面,就像下面这种:

当然也可以不自动移动,只需要判断是删除的时候不添加这段代码即可,什么时候是删除的时候呢,就是 onTextChanged(CharSequence s, int start, int before, int count) 中 count 等于0的时候。

实现银行卡呢,那就更简单了,只需要对每一个四位添加空格,乃至推广到间隔几个数字的空格,代码如下:

private static final int divide = 4;if (length > 0 && length / divide > 0) {for (int i = 0; i < length / divide; i++) {s.insert((i + 1) * divide + i, String.valueOf(space));if (editText.getSelectionStart() == (i + 1) * divide + 1 + i) {editText.setSelection((i + 1) * divide + i);}}}

代码思路跟上面是一样的,没有什么好解释的了,遇到间隔5个、6个,重新设置一下参数就好了,所以最终成果是这样的:

电话号码空格输入:

银行卡号输入:

三、结束语

这篇文章越写感觉这个需求不难,但是我还是记录一下吧,有问题的或者有更好的方法欢迎大家吐槽,哈哈。最近感觉博客有的页面广告等干扰越来越多了,太影响阅读了,给大家推荐一款我发现的 Chrome 插件,简阅,专注阅读,地址在此 简阅。

手机号码、银行卡输入添加空格相关推荐

  1. android 手机号码显示加空格,Android实现输入手机号时自动添加空格

    为了用户更好的体验,我们在输入手机号的时候 添加空格,方便用户查看是否输入错误,不多说代码上去 final EditText et_phone = (EditText) findViewById(R. ...

  2. Excel如何快速给手机号码添加空格分段显示?

    今天跟大家分享一下Excel如何快速给手机号码添加空格分段显示? 1.如下图我们想要批量给手机号码添加空格,首先我们选中身份证单元格区域. ​ 2.点击[DIY工具箱] 3.点击[手机号]选择[分段显 ...

  3. android输入框EditText输入银行卡,输入手机,输入身份证格式化的实现

    SpaceTextWatcher android输入框输入银行卡,输入手机,输入身份证格式化的实现 项目地址 SpaceTextWatcher 实现方式 @Overridepublic void be ...

  4. LeetCode 2109. 向字符串添加空格

    文章目录 1. 题目 2. 解题 1. 题目 给你一个下标从 0 开始的字符串 s ,以及一个下标从 0 开始的整数数组 spaces . 数组 spaces 描述原字符串中需要添加空格的下标.每个空 ...

  5. 解决IDEA输入ctrl+空格,和输入法冲突的问题

    windows10 使用IDEA快捷键时,输入ctrl+空格,一直时切换中英文,网上的注册表方式没用效果.因为使用的微软自带的输入法,不想换第三方输入法,最后采用的方式是新增一个英语的语言,作为解决方 ...

  6. [Latex] 插入图片 | 插入表格 | 符号、文本粗体 | 单栏、双栏添加行号 | 添加空格 | 注释快捷键 | 维度 | 脚注 | 公式 | 分点 |

    1. 插入图片 添加图片 使用福昕编辑器进行裁剪,然后(将图片统一放入picture文件夹): \begin{figure} (双栏占一栏) \begin{figure}[h] % 可选,h这里:t顶 ...

  7. CSDN博客:添加空格、空行的多种方法(亲测有用)

    1. 添加空格 空格问题:   在编辑CSDN文章的时候,无论我们输入多少个空格,最终都只会显示一个空格. 解决方法: 名称         代码         长度 不换行空格           ...

  8. MathType如何禁止在公式后面自动添加空格

    使用环境(蓝色粗体字为特别注意内容) 1.软件环境:Win7 32 bit,Office 2007,Mathtype 6.9b 2.参考文献:https://blog.csdn.net/pijianz ...

  9. php怎么添加空格,php给每个段落添加空格的方法

    php给每个段落添加空格的方法 本文实例讲述了php给每个段落添加空格的方法.分享给大家供大家参考.具体实现方法如下: //Prepends whitespace to each line of a ...

最新文章

  1. 用C#操纵IIS(代码)
  2. netfilter的笔记3--那些内置的表
  3. LinkedHashMap源码分析
  4. 8.27 直播| 挖掘传统行业日志大数据的无限价值
  5. EasyUI加载外部页面需要使用html片段
  6. Android天气预报设计
  7. MVC,MVP,MVVM
  8. 用CNN做NLP文本分类竞赛
  9. 机器学习总结之第一章绪论
  10. Shiro-从数据表中初始化资源和权限
  11. 数据抽取oracle_【跟我学】特征抽取算法与应用
  12. java 报表工具_15个Java的报表工具简介
  13. 我酸了,曝光几个腾讯 阿里P8前同事的副业收入
  14. c语言rewind函数作用,C 文件 rewind() 函数
  15. ​相亲APP开发软件为广大单身男女牵线搭桥​
  16. @Inherited
  17. CC00022.CloudOpenStack——|OpenStack组件.V01|——|OpenStack-Dashboard|Dashboard基础条件配置|
  18. python magic number,boost.python 做出来的pyc报bad magic number
  19. Linux自定义动态壁纸,一个简单的bash脚本可根据特定条件设置动态壁纸
  20. Abaqus与Ansys的区别和不同, 两种软件哪个更好?

热门文章

  1. mysql yuancheng nv_GPU前沿:NVLink与PCIe的对比学习
  2. (四)DepthAI-python相关接口:OAK Messages
  3. Python「pytesseract」:中文识别模块
  4. [附源码]SSM计算机毕业设计超市收银系统JAVA
  5. (转)Twitter开源的通用性数据切分中间件Gizzard
  6. R-C3D—基于区域卷积3D网络的时序行为检测
  7. kaggle Jigsaw Rate有毒评论打分比赛内容总结
  8. Idea Java 快捷键整理
  9. 用IP段区分境内外用户
  10. 如何将年薪从十五万到五十万系列之从一个sql引发的hive谓词下推的全面复盘及源码分析(上)