Android EditText 银行卡4位一空 删除的时候光标不错乱 private String lastString;//上次输入框中的内容private int deleteSelect;//删除的光标位置 //上下文你就自己写吧,我就懒得写完整的了。edit_c
private String lastString;//上次输入框中的内容 private int deleteSelect;//删除的光标位置 //上下文你就自己写吧,我就懒得写完整的了。 edit_card_num.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { //因为重新排序之后setText的存在 //会导致输入框的内容从0开始输入,这里是为了避免这种情况产生一系列问题 if (start == 0 && count > 0) { return; } String editTextContent = EditTextUtils.getText(edit_card_num); if (TextUtils.isEmpty(editTextContent) || TextUtils.isEmpty(lastString)) { return; } editTextContent = EditTextUtils.addSpeaceByCredit(editTextContent); //如果最新的长度 < 上次的长度,代表进行了删除 if (editTextContent.length() <= lastString.length()) { deleteSelect = start; } else { deleteSelect = editTextContent.length(); } } @Override public void afterTextChanged(Editable s) { //获取输入框中的内容,不可以去空格 String etContent = EditTextUtils.getText(edit_card_num); if (TextUtils.isEmpty(etContent)) { return; } //重新拼接字符串 String newContent = addSpeaceByCredit(etContent); //保存本次字符串数据 lastString = newContent; //如果有改变,则重新填充 //防止EditText无限setText()产生死循环 if (!etContent.equals(newContent)) { edit_card_num.setText(newContent); //保证光标的位置 edit_card_num.setSelection(deleteSelect > newContent.length() ? newContent.length() : deleteSelect); } //判断是否满足信用卡格式,注意去空格判断 if (MatcheUtils.isCreditNumber(newContent.replaceAll(" ", ""))) { return; } } }); //下面加上两个工具类。 public class EditTextUtils { public static String getTextTrim(EditText text) { return text.getText().toString().replaceAll(" ", ""); } public static String getText(EditText text) { return text.getText().toString(); } public static String addSpeaceByCredit(String content) { if (TextUtils.isEmpty(content)) { return ""; } //去空格 content = content.replaceAll(" ", ""); if (TextUtils.isEmpty(content)) { return ""; } //卡号限制为16位 if (content.length() > 22) { content = content.substring(0, 22); } StringBuilder newString = new StringBuilder(); for (int i = 1; i <= content.length(); i++) { //当为第4位时,并且不是最后一个第4位时 //拼接字符的同时,拼接一个空格 //如果在最后一个第四位也拼接,会产生空格无法删除的问题 //因为一删除,马上触发输入框改变监听,又重新生成了空格 if (i % 4 == 0 && i != content.length()) { newString.append(content.charAt(i - 1) + " "); } else { //如果不是4位的倍数,则直接拼接字符即可 newString.append(content.charAt(i - 1)); } } return newString.toString(); } } public class MatcheUtils { public static boolean isCreditNumber(String idCard) { return !TextUtils.isEmpty(idCard) && idCard.matches("^[0-9]{16}$"); } public static boolean isBankNumber(String bankNumber) { return !TextUtils.isEmpty(bankNumber) && bankNumber.matches("^(\\d{16}|\\d{19})$"); } }