待写

Android 间隔显示电话号码

2022-03-06  本文已影响0人  peachFestival

Android 间隔显示电话号码

概述

项目经理提了一个需求,要求输入框的手机号码以xxx xxxx xxxx的格式显示,网上找了一些文章发现或多或少都存在一些bug(光标位置bug),于是决定自己写一个,直接上代码。

代码

private int selection = 0;//手机号输入框光标位置
private final String separator = " ";//分隔符
private EditText etUsername;

etUsername.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                //do nothing
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                String text = s.toString();
                boolean isPass = true;
                for (int i = 0; i < text.length(); i ++) {
                    boolean isDivide = separator.equals(text.substring(i, i+1));
                    if ((i == 3||i == 8)&&!isDivide) {//指定位置不为分隔符
                        isPass = false;
                        break;
                    }
                    if (isDivide&&i != 3&&i != 8) {//非指定位置为分隔符
                        isPass = false;
                        break;
                    }
                    if ((i == text.length()-1)&&isDivide) {//最后一位为分隔符(删除操作)
                        isPass = false;
                        break;
                    }
                }

                if (!isPass) {
                    StringBuffer sb = new StringBuffer(text.replaceAll(separator, ""));
                    if (count == 1) {//输入字符 设置光标位置
                        if (start == 3||start == 8) {
                            selection = start + 2;
                        } else {
                            selection = start + 1;
                        }
                    } else if (before == 1) {//删除字符 设置光标位置
                        selection = start;

                        //删除的为分隔符,需将分隔符前一个字符删除
                        if (start == 3) {
                            sb.delete(start - 1, start);
                            selection = start - 1;
                        } else if (start == 8) {
                            sb.delete(start - 2, start - 1);
                            selection = start - 1;
                        }

                        if (separator.equals(text.substring(text.length()-1))){//最后一位为分隔符
                            selection = start - 1;
                        }
                    }

                    //添加分隔符
                    if (sb.length() > 3) {
                        sb.insert(3, separator);
                    }
                    if (sb.length() > 8) {
                        sb.insert(8, separator);
                    }
                    etUsername.setText(sb.toString());
                }

                if (before > 1||count > 1) {//setText方法时设置 光标位置
                    if (etUsername.getText().toString().length() >= selection) {
                        etUsername.setSelection(selection);
                        selection = 0;
                    }
                }
            }

            @Override
            public void afterTextChanged(Editable editable) {
                //do nothing
            }
        });

说明

可以再抽象一层自定义间隔位置兼容实现类似银行卡XXXX XXXX XXXX XXXX等的分隔。感觉自己写的有点复杂,有更好的实现方式欢迎大家指教。

上一篇 下一篇

猜你喜欢

热点阅读