当前位置 : 主页 > 编程语言 > c++ >

Android EditText 银行卡4位一空 删除的时候光标不错乱

来源:互联网 收集:自由互联 发布时间:2021-07-03
Android EditText 银行卡4位一空 删除的时候光标不错乱 private String lastString;//上次输入框中的内容private int deleteSelect;//删除的光标位置 //上下文你就自己写吧,我就懒得写完整的了。edit_c
Android EditText 银行卡4位一空 删除的时候光标不错乱
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})$");
    }


}
网友评论