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})$");
}
}
