输入时候动态的让银行卡格式化

1.目前已知长按粘贴会有部分bug, 暂时没有解决, 统一处理是把光标放到最后.

2.无法长按删除, 猜测是 format(String.valueOf(editable)); 方法后删除按钮的焦点消失, 暂时没解决.

/**
 * 选中一个粘贴一个(光标停留在粘贴元素最后一个)
 * 选中一个删除 (光标停留在删除掉的元素的start位置)
 * 选中一个粘贴多个(光标停留在粘贴元素最后一个)
 *
 * 选中多个粘贴相同数量 (光标停留在粘贴元素最后一个)
 * 选中多个粘贴少量(光标停留在粘贴元素最后一个)
 * 选中多个粘贴更多(光标停留在粘贴元素最后一个)
 */
/*** Created by sqj on 2017/12/5.*/public class BankIDFormatEditText extends EditText {String space = " ";private boolean shouldStopChange = false;private int textOnViewLength;private String mTextBefore;private String mTextAfter;private int mStartPosition;private int mEndPosition;public BankIDFormatEditText(Context context) {this(context, null);}public BankIDFormatEditText(Context context, AttributeSet attrs) {this(context, attrs, 0);}public BankIDFormatEditText(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {setFocusable(true);setEnabled(true);setFocusableInTouchMode(true);addTextChangedListener(new BandCardWatcher());}private class BandCardWatcher implements TextWatcher {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {if (shouldStopChange) {} else {mTextBefore = String.valueOf(s);mStartPosition = getSelectionStart();mEndPosition = getSelectionEnd();// 第一次改变后总长度(手输)mBeforeChangeLength = s.toString().length();}}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {
//            Log.d("BandCardWatcher", "onTextChanged:" + s);}@Overridepublic void afterTextChanged(Editable editable) {if (shouldStopChange) {shouldStopChange = false;return;}shouldStopChange = true;mTextAfter = String.valueOf(editable);if (mStartPosition!=mEndPosition){// 这是长按选中的状态format(editable);setSelection(textOnViewLength);}else {if (mTextBefore.length() < mTextAfter.length()) {// 增加format(editable);if ((mStartPosition + 1) % 5 == 0) {if (mStartPosition != 0) {setSelection(mStartPosition + 2);}} else {setSelection(mStartPosition + 1);}} else if (mTextBefore.length() > mTextAfter.length()) { // 减少if (mStartPosition % 5 == 0) {if (mStartPosition != 0) {// 光标在空格后面点删除的情况editable.replace(mStartPosition - 2, mStartPosition - 1, " ");}}format(editable);if (mStartPosition != 1 && (mStartPosition - 1) % 5 == 0) {setSelection(mStartPosition - 2);} else if (mStartPosition != 0) {setSelection(mStartPosition - 1);}} else if (mTextBefore.length() == mTextAfter.length()) {// 替换format(editable);setSelection(mStartPosition);}}}}private void format(Editable editable) {String str = editable.toString().trim().replaceAll(space, "");int len = str.length();int courPos;StringBuilder builder = new StringBuilder();for (int i = 0; i < len; i++) {if (i % 4 == 0 && i != 0) {builder.append(space);builder.append(str.charAt(i));} else {builder.append(str.charAt(i));}}courPos = builder.length();textOnViewLength = builder.toString().length();setText(builder.toString());}}

银行卡格式化(每四位空格,删除添加,更变等)相关推荐

  1. input 银行卡输入框,四位一空格

    input 银行卡输入框,四位一空格 项目中遇到输入银行卡的input框,并且要求是4位一空,四位一空的问题比较容易<input type="tel" id="ba ...

  2. Chrome谷歌浏览器新功能 删除主题更方便

    Chrome谷歌浏览器新功能 删除主题更方便​ 根据报道,不久前xx Chrome可以改变浏览器界面的颜色,现在Chromium Team又增加了一个功能,就是可以从New Tab Page(新标签页 ...

  3. 如何删除添加了.css()函数的样式?

    本文翻译自:How can I remove a style added with .css() function? I'm changing CSS with jQuery and I wish t ...

  4. R语言可视化分面图、多变量分组多水平t检验、可视化多变量分组多水平分面条形图(faceting bar plot)并添加显著性水平、在标签和绘图上边框之间添加15%的空格、添加抖动数据点

    R语言可视化分面图.多变量分组多水平t检验.可视化多变量分组多水平分面条形图(faceting bar plot)并添加显著性水平.在标签和绘图上边框之间添加15%的空格.添加抖动数据点 目录

  5. c语言输出几个空格,新人提问:如何将输出时每行最后一个空格删除

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 如何将每行最后一个空格删除,使矩阵只有数字间有空格,没有多余空格? #include #include int main() { int i,j,k,m, ...

  6. c语言中怎么吃掉最后的空格,新人提问:如何将输出时每行最后一个空格删除...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 如何将每行最后一个空格删除,使矩阵只有数字间有空格,没有多余空格? #include #include int main() { int i,j,k,m, ...

  7. c语言行末不要输出多余空格,新人提问:如何将输出时每行最后一个空格删除...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 如何将每行最后一个空格删除,使矩阵只有数字间有空格,没有多余空格? #include #include int main() { int i,j,k,m, ...

  8. c语言输出最后不带空格,新人提问:如何将输出时每行最后一个空格删除

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 如何将每行最后一个空格删除,使矩阵只有数字间有空格,没有多余空格? #include #include int main() { int i,j,k,m, ...

  9. c语言输出去掉最后一行回车,新人提问:如何将输出时每行最后一个空格删除...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 如何将每行最后一个空格删除,使矩阵只有数字间有空格,没有多余空格? #include #include int main() { int i,j,k,m, ...

最新文章

  1. 基于深度学习和迁移学习的识花实践
  2. 《JAVA练习题目11》学生类有属性姓名(字符串类型)和选修课程信息(ArrayList<Course>对象)两个属性,和三个方法
  3. 你不是不擅长数学,你只是打开方式不对
  4. dpkg status database is locked by another process
  5. openwrt nas_NAS里整个软路由
  6. 使用 NVIDIA Kaolin Wisp 重建3D场景
  7. html怎么把盒子做成超链接,把整个DIV变成超链接
  8. node--puppeteer网页截屏
  9. 车主必看,2021年车险改革内容,2022年车险改革
  10. 如何对word中不同页面设置不同页眉页脚
  11. 红米NOTE8PRO拍照技巧
  12. 视频剪辑软件,AI智能合并随机生成新视频,并设置视频数量以及时长
  13. Swift 中字符串截取的几种常见情况
  14. 如何在EDUIS中导出ETL字幕模板_Arctime教程——将字幕导出到剪辑/合成软件
  15. Mycat数据库中间件(史上最详细)
  16. 开源 区块链_区块链将如何影响开源
  17. 信号量(Semaphore)-你真的了解吗?
  18. 最大公约数、最小公倍数与算术基本定理
  19. 上海亚商投顾:创业板缩量跌近1% 血氧仪概念逆市大涨
  20. cmake,make

热门文章

  1. Win11里面【应用或关闭Windows功能】在哪
  2. 【图像去噪】基于matlab高斯+均值+中值+双边滤波图像去噪【含Matlab源码 1872期】
  3. LiveMe x TiDB丨单表数据量 39 亿条,简化架构新体验
  4. C++友元(友元函数)
  5. 紫外线杀菌器:过流式Photoscience紫外线杀菌器
  6. Linus Torvalds:最庆幸的是 30 年后,Linux 不是一个“死”项目
  7. IKBC_DC-108 改装,加灯,加锂电池和充电
  8. 【艾琪出品】《数据库课程设计》【参考】
  9. 增益和偏移的概念_2 理解与校准 ADC 系统的偏移和增益误差
  10. 通过宏函数计算结构体成员偏移量