美文网首页待写
Android 间隔显示电话号码

Android 间隔显示电话号码

作者: peachFestival | 来源:发表于2022-03-06 16:02 被阅读0次

    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等的分隔。感觉自己写的有点复杂,有更好的实现方式欢迎大家指教。

    相关文章

      网友评论

        本文标题:Android 间隔显示电话号码

        本文链接:https://www.haomeiwen.com/subject/fbhnrrtx.html