在项目开发有需要用户输入银行卡号,为了便于用户区分自己是否输入的正确,提升用户体验,特做了银行卡号四位一空格的操作。同时考虑到粘贴复制过来的银行卡号也要做四位一空格的处理,所以自定义了一个监听事件,用来处理空格。

具体的操作如下:

/**

* 银行卡4位插入一空格监听

* Created by zeng on 2018/9/25.

*/

public class NumSpaceTextWatcher implements TextWatcher {

private static final int DEFAULT_OFFSET = 4;

// 目标输入框

private final EditText mDesTxt;

// 偏移量(几位插入一空格)

private int mOffset;

// 记录目标字符串

private StringBuffer mBuffer = new StringBuffer();

// 改变之前的文本长度

private int mBeforeTextLength;

// 改变之后的文本长度

private int mOnTextLength;

// 改变之前去除空格的文本长度

private int mBeforeNumTxtLength;

// 改变之后去除空格的文本长度

private int mNumTxtLength;

// 目标 光标的位置

private int mLocation = 0;

// 之前 光标的位置(可判断用户是否做删除操作)

private int mBeforeLocation = 0;

// 改变前有多少空格

private int mBeforeSpaceNumber = 0;

// 是否选中空格覆盖

private boolean isOverrideSpace;

// 被覆盖的空格数

private int mOverrideSpaceNum;

// 是否是粘贴(此粘贴非彼粘贴)

private boolean isPaste;

// 复制的字符数(不包括空格)

private int mPasteNum;

// 是否需要进行格式化字符串操作

private boolean isChanged = false;

//要处理的View

private LinearLayout disposeView;

public NumSpaceTextWatcher(@NonNull EditText target) {

this(target, DEFAULT_OFFSET);

}

public NumSpaceTextWatcher(@NonNull EditText target, int offset) {

if (target.getInputType() == InputType.TYPE_CLASS_NUMBER) {

target.setInputType(InputType.TYPE_CLASS_TEXT);

// 当InputType为Number时,手动设置我们的Listener

target.setKeyListener(new MyDigitsKeyListener());

} else if (target.getInputType() != InputType.TYPE_CLASS_TEXT) {

// 仅支持Text及Number类型的EditText

throw new IllegalArgumentException("EditText only support TEXT and NUMBER InputTyp!");

}

mDesTxt = target;

mOffset = offset;

}

//对特殊的控件要做处理的

public NumSpaceTextWatcher(@NonNull EditText target, int offset, LinearLayout disposeView) {

if (target.getInputType() == InputType.TYPE_CLASS_NUMBER) {

target.setInputType(InputType.TYPE_CLASS_TEXT);

// 当InputType为Number时,手动设置我们的Listener

target.setKeyListener(new MyDigitsKeyListener());

} else if (target.getInputType() != InputType.TYPE_CLASS_TEXT) {

// 仅支持Text及Number类型的EditText

throw new IllegalArgumentException("EditText only support TEXT and NUMBER InputTyp!");

}

mDesTxt = target;

mOffset = offset;

this.disposeView = disposeView;

}

@Override

public void beforeTextChanged(CharSequence s, int start, int count, int after) {

mBeforeTextLength = s.length();

mBeforeNumTxtLength = s.toString().replaceAll(" ", "").length();

mBeforeLocation = mDesTxt.getSelectionEnd();

// 重置mBuffer

if (mBuffer.length() > 0) {

mBuffer.delete(0, mBuffer.length());

}

// 计算改变前空格的个数

mBeforeSpaceNumber = 0;

for (int i = 0; i < s.length(); i++) {

if (s.charAt(i) == ' ') {

mBeforeSpaceNumber++;

}

}

}

@Override

public void onTextChanged(CharSequence s, int start, int before, int count) {

mOnTextLength = s.length();

mNumTxtLength = s.toString().replaceAll(" ", "").length();

// 判断是否是粘贴,其中粘贴小于offset位的不做判断,并且offset>2判断才有意义

if (mOffset >= 2 && count >= mOffset) {

isPaste = true;

mPasteNum = count;

} else {

isPaste = false;

mPasteNum = 0;

}

// 若是经过afterTextChanged方法,则直接return

if (isChanged) {

isChanged = false;

return;

}

// 若改变后长度小于等于mOffset - 1,则直接return

if (mOnTextLength <= mOffset - 1) {

isChanged = false;

return;

}

// 若改变前后长度一致,并且数字位数相同,则isChanged为false

// (数字位数相同是防止用户单选空格后输入数字)

if (mBeforeTextLength == mOnTextLength && mBeforeNumTxtLength == mNumTxtLength) {

isChanged = false;

return;

} else {

isChanged = true;

}

// 若要进行格式化,则判断该情况

// 判断是否选中空格覆盖(排除删除空格的情况)

if (before == 1 && count == 0) {

isOverrideSpace = false;

} else {

isOverrideSpace = mBeforeTextLength - mBeforeSpaceNumber - before + count != mNumTxtLength;

}

// 若是该情况,计算覆盖空格的个数

if (isOverrideSpace) {

mOverrideSpaceNum = mNumTxtLength - (mBeforeTextLength - mBeforeSpaceNumber - before + count);

} else {

mOverrideSpaceNum = 0;

}

}

@Override

public void afterTextChanged(Editable s) {

if (isChanged) {

mLocation = mDesTxt.getSelectionEnd();

// 去除空格

mBuffer.append(s.toString().replace(" ", ""));

// 格式化字符串,mOffset位加一个空格

int index = 0;

int mAfterSpaceNumber = 0;

while (index < mBuffer.length()) {

if (index == mOffset * (1 + mAfterSpaceNumber) + mAfterSpaceNumber) {

mBuffer.insert(index, ' ');

mAfterSpaceNumber++;

}

index++;

}

// 判断是否是粘贴键入

if (isPaste) {

mLocation += mPasteNum / mOffset;

isPaste = false;

// 判断是否是选中空格输入

} else if (isOverrideSpace) {

mLocation += mOverrideSpaceNum;

// 判断此时光标是否在特殊位置上

} else if (mLocation % (mOffset + 1) == 0) {

// 是键入OR删除

if (mBeforeLocation <= mLocation) {

mLocation++;

} else {

mLocation--;

}

}

// 若是删除数据刚好删除一位,前一位是空格,mLocation会超出格式化后字符串的长度(因为格

// 式化后的长度没有不包括最后的空格),将光标移到正确的位置

String str = mBuffer.toString();

if (mLocation > str.length()) {

mLocation = str.length();

} else if (mLocation < 0) {

mLocation = 0;

}

s.replace(0, s.length(), str);

Editable editable = mDesTxt.getText();

Selection.setSelection(editable, mLocation);

}

if (s.length() <= 0 && disposeView != null) {

disposeView.setVisibility(View.GONE);

}

}

// 继承DigitsKeyListener,实现我们自己的Listener

private class MyDigitsKeyListener extends DigitsKeyListener {

private char[] mAccepted = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' '};

@Override

protected char[] getAcceptedChars() {

return mAccepted;

}

}

}

自定义的监听事件里代码都有注释,请自行查看。监听事件写好了后,就在代码中对EditText设置监听事件:

//银行卡输入框单独设置一个监听用于四位空一格

EditText.addTextChangedListener(

/**

* new NumSpaceTextWatcher(EditText target, int offset, LinearLayout disposeView)

* 这个方法里的参数1:要监听的EditText;参数2:几位数字空一格(加入想三位数字空一格可以将这里设置成3);

* 参数3:这个是我自己传的一个view,用于处理别的控件的显示与否,大家用的时候这个地方可以不用传

*/

new NumSpaceTextWatcher(activityOpenBalaceAmountBinding.openAmountBankNum,

4, activityOpenBalaceAmountBinding.bankMessageAll));

通过输入数字发现确实是四位一空格,同时在删除的时候会将空格自动删除掉的。从别处粘贴复制过来的一串数字也可以达到同样的效果。在此,EditText的输入银行卡号四位一空格的功能就写完了。既然需要在输入框里输入银行卡号,就会有将银行卡号传递到下一层的操作,在此提醒,在获取EditText输入框里的text时,不要忘了去除空格!

假如银行卡号不是用户手动输入,也不是复制粘贴过来的,比如从后台获取到用户的银行卡号,想四位一空格展示在TextView里,那么用上面这个方法就不现实了。可以用正则表达式来实现:

String cardNum = "6217710859874620".replaceAll("\\d{4}(?!$)", "$0 ");

TextView.setText(cardNum);

这样就可以实现银行卡号四位一空格展示在TextView中。

延伸功能:

作者:安卓搬砖小曾

android 银行卡号 4位,Android中的EditText输入银行卡号四位空一格相关推荐

  1. Android中的EditText输入银行卡号四位空一格

    近期项目开发有需要用户输入银行卡号,为了便于用户区分自己是否输入的正确,提升用户体验,特做了银行卡号四位一空格的操作.同时考虑到粘贴复制过来的银行卡号也要做四位一空格的处理,所以自定义了一个监听事件, ...

  2. 【android】EditText输入银行卡号每四位空一格

    完美仿微信银行卡号输入,输入每4个数字就自动添加一个空格 代码如下: import android.text.Editable; import android.text.Selection; impo ...

  3. Android开发之限制输入框长度 | 限制EditText输入长度 | 限制AppCompatEditText长度的方法

    直接上代码 package cn.yhsh.keyeventdemo;import android.text.InputFilter; import android.text.Spanned;/*** ...

  4. matlab 删掉空行,在MATLAB中使用XLSWRITE:如何删除空单元格?

    如果我理解你的问题的第一部分,你想删除 newfile 单元格数组中只包含空单元格的任何行 . 您可以使用函数CELLFUN来查找空单元格,使用函数ALL查找包含所有空单元格的行,然后使用logica ...

  5. c语言自动输入一位数字,c语言:要求输入一个四位整数,然后将各位数字按英文输出...

    满意答案 我I就这样I 2015.11.22 采纳率:50%    等级:9 已帮助:568人 123456789101112131415161718192021222324252627282930# ...

  6. if函数如何嵌入多个android,Android中多个EditText输入效果的解决方式

    前言 在开发中,我们常常遇到这种情况 我们往往需要的是下面这种效果 但是如果把这些实现的代码写在Activity中会比较麻烦,影响代码美观 解决方法 于是就有了下面这个辅助类,禁用了按钮的点击事件和按 ...

  7. 谷歌表格_如何计算Google表格中的空白或空单元格

    谷歌表格 When you're analyzing data in a spreadsheet, counting empty or blank cells could help you focus ...

  8. Android中控制银行卡号的输入 即4个数字空一格

    最近在做一个输入扫描银行卡的需求,要求通过card.io这个开源的sdk扫描获得银行卡号,或者直接输入卡号.那么在输入卡号的过程中,需要每4个数字自动空一格,实现起来也比较简单,主要是实现一个Text ...

  9. android edittext设置内容为空,Android中给数据库添加EditText中内容,添加后数据为空的情况...

    搞了两天的代码,将EditText中内容添加至数据库,怎么都搞不定,总是插入数据为空: 这里需要将获取EditText内容的代码写在onClick函数中. 举例如下: EditText代码如下: an ...

  10. android input鼠标坐标,android - 如何在EditText中设置光标位置?

    android - 如何在EditText中设置光标位置? 有两个EditText,在加载页面时,第一个EditText中设置了一个文本,所以现在光标将在EditText的起始位置,我想在第二个Edi ...

最新文章

  1. Pytorch | BERT模型实现,提供转换脚本【横扫NLP】
  2. 决策树算法的原理(接地气版)
  3. 赵劲松:预知潜在风险,做化工安全科技创新的引领者
  4. 创建磁盘陈列(RAID5)使用经验与原则
  5. Check Point CEO:“我们正在积极寻找收购目标”
  6. 使用TortoiseGit提交代码到Github.com上 详细步骤
  7. 如何在C#中使用反射获取集合元素类型
  8. 持续集成部署Jenkins工作笔记0002---认识Jenkins和Hudson
  9. Qt QT的I/O流 QT输入输出
  10. Mac解压Windows 压缩文件(.zip格式)乱码问题
  11. Android Theme主题继承(SDK下主题和v7包下主题)
  12. No module named ‘wrapt‘
  13. java三元运算符_java三元运算符详解
  14. Javawbe的实战案例
  15. Microsoft Excel 教程:如何在 Excel 中筛选唯一值或删除重复值?
  16. 电子签名法学习-(1)电子认证服务机构
  17. opencv中 画六边形
  18. 金仓数据库 KingbaseES SQL 语言参考手册 (14. SQL语句:COMMIT 到 CREATE LANGUAGE)
  19. Could not build wheels for cryptography which use PEP 517 and cannot be installed directly
  20. 让你对DC完全了解的88条名词解释(转)

热门文章

  1. 2018年信息安全大事件一览
  2. 解决sql server挂起
  3. 函数求和公式计算机出库入库,出库入库表格函数公式.doc
  4. sqlprompt安装注册
  5. linux每天定时开关机,如何实现ubuntu每天定时关机
  6. 计算机控制课设串级回路,计算机控制系统课程设计
  7. 自制操作系统软盘镜像的创建过程
  8. sqlyong 安装教程
  9. c语言设计一个自动阅卷功能,程序阅卷论文,关于编程题自动阅卷系统的设计实现相关参考文献资料-免费论文范文...
  10. JS如何判断一个对象是否为JSON对象