android 手机号码特殊显示(带空格或者* 号)

本文介绍了一种通过自定义Android控件实现手机号码格式化的方案,包括两种格式:一种是将手机号码显示为151 1111 1111的形式,另一种是将手机号码显示为151****1111的形式。文章提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

现在app 内部手机号码显示的格式都是 151 1111 1111 或者 151 xxxx 1111,这样显示更加方便显示以及阅读,主要处理逻辑就是对字符串的增加和替换,也不是很难,记录下。


1. 151 1111 1111 中间用空格区分显示

我这里是直接写了一个类似格式的控件,在输入字符之后进行处理

这里写图片描述

下面是完整的代码,主要逻辑就是 format 里面对字符传的处理

import android.content.Context;
import android.content.res.TypedArray;
import android.support.v7.widget.AppCompatEditText;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;

import com.lanjinger.cailianpresspro.R;

/**
 * Created by luhui on 2017/12/28.
 * 150 xxx xxxx
 */

public class PhoneNumberEditText extends AppCompatEditText {
    private boolean shouldStopChange = false;
    private final String WHITE_SPACE = " ";

    private PhoneNumberEditTextListen listener;

    public PhoneNumberEditText(Context context) {
        this(context, null);
    }

    public PhoneNumberEditText(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public PhoneNumberEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context,attrs,defStyleAttr);
    }

    private void init(Context context, AttributeSet attrs, int defStyleAttr) {
        TypedArray array = getContext().obtainStyledAttributes(attrs, R.styleable.phoneEditText,defStyleAttr,0);
        array.recycle();
        format(getText());
        shouldStopChange = false;
        setFocusable(true);
        setEnabled(true);
        setFocusableInTouchMode(true);
        addTextChangedListener(new CardTextWatcher());
    }

    private class CardTextWatcher implements TextWatcher {

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            if(listener!=null)listener.beforeTextChanged(s,start,count,after);
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {}

        @Override
        public void afterTextChanged(Editable editable) {
            format(editable);
            if(listener!=null&& !TextUtils.isEmpty(editable.toString()))listener.afterTextChanged(editable);
        }
    }

    private void format(Editable editable) {
        if (shouldStopChange) {
            shouldStopChange = false;
            return;
        }

        shouldStopChange = true;

        String str = editable.toString().trim().replaceAll(WHITE_SPACE, "");
        int len = str.length();
        int courPos;

        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < len; i++) {
            builder.append(str.charAt(i));
            if (i == 2 || i == 6 ) {
                if (i != len - 1)
                    builder.append(WHITE_SPACE);
            }
        }
        courPos = builder.length();
        setText(builder.toString());
        setSelection(courPos);

    }

    public String getPhoneNumberText() {
        return getText().toString().trim().replaceAll(" ", "");
    }

    public interface PhoneNumberEditTextListen{
        void beforeTextChanged(CharSequence s, int start, int count, int after);
        void afterTextChanged(Editable editable);
    }

    public void setListener(PhoneNumberEditTextListen listener) {
        this.listener = listener;
    }

}

里面用到的自定义的属性,可根据需求自行添加,在attrs.xml 中

<declare-styleable name="phoneEditText">
        <attr name="editTextType" format="integer">
            <enum name="phoneNum"   value="1"/>
        </attr>
    </declare-styleable>

相关的引用

<com.xxxx.views.customviews.PhoneNumberEditText
                android:id="@+id/login_phone_input"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/transparent"
                android:inputType="number"
                android:maxLength="13"
                android:textColor="@color/white"
                android:textSize="18sp"
                android:hint="@string/pls_input_phone"
                android:textColorHint="@color/white_20"
                android:textCursorDrawable="@drawable/search_cursor"
                tools:text="" />

应该是很完整的了,直接就可以使用了。那个listener 也可自行定义和修改,我这里只有之前和之后的监听,在引用的主界面 收到注册 调用就行。

2. 151 xxxx 1111 中间用*区分显示

这个直接在 替换相关字符串就可以了,主要相关字符的位数;

//151 1111 1111 -> 151 **** 1111
private String dealPhoneNumber(String phoneNumber) {
        if (StringUtil.isNotEmpty(phoneNumber)) {
            int len = phoneNumber.length();
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < len; i++) {
                if (i > 2 && i < 7) {
                    builder.append("*");
                } else {
                    builder.append(phoneNumber.charAt(i));
                }

                if (i == 2 || i == 6) {
                    if (i != len - 1)
                        builder.append(" ");
                }
            }

            return builder.toString();
        }
        return null;
    }
<think>好的,用户遇到了ADB版本无法显示的问题,需要排查安装路径和环境变量设置。首先,我需要回忆ADB的基本知识。ADB是Android Debug Bridge,属于Android SDK的一部分,通常位于platform-tools目录下。用户可能没有正确安装或配置环境变量。 用户提到运行adb version没有显示,这可能是因为系统找不到adb.exe。常见原因包括:ADB未安装、路径未添到环境变量,或者多个ADB版本冲突。 第一步,检查ADB是否安装。用户可能没有安装platform-tools,或者安装位置不对。需要确认SDK Manager中是否安装了Android SDK Platform-Tools。如果已安装,找到其路径,比如C:\Android\android-sdk\platform-tools。 第二步,检查环境变量。如果用户没有将platform-tools目录添到PATH,命令行可能无法识别adb命令。需要指导用户如何查看和修改PATH变量,包括系统环境变量和用户环境变量。同时,注意路径是否正确,尤其是SDK更新后路径是否变化,这点引用2中提到过。 第三步,验证ADB路径。直接在命令行输入完整路径的adb.exe,比如C:\Android\android-sdk\platform-tools\adb.exe version,看是否能运行。如果可以,说明环境变量配置有问题;如果不行,可能需要重新安装或修复SDK工具。 第四步,检查冲突的ADB实例。其他程序如手机助手可能自ADB,导致版本冲突。需要检查是否有多个adb.exe在运行,并结束这些进程,然后重新尝试。 第五步,重新安装或更新SDK工具。如果上述步骤无效,可能需要通过SDK Manager重新安装platform-tools,或者更新到最新版本,确保ADB文件完整。 还要考虑用户是否按照引用1中的建议,将.android目录正确放置,但这个问题更多涉及模拟器而非ADB本身。不过环境变量设置错误可能导致类似问题,如引用2所述,路径未正确更新。 总结下来,用户需要逐步验证安装、路径、冲突和重新安装。过程中要给出具体的命令行指令,如echo %PATH%或which adb(在Linux/Mac),帮助用户排查。同时提醒用户注意路径中的空格特殊字符,可能影响识别。</think>### 排查ADB未显示版本问题的步骤 #### 1. **确认ADB是否安装** - **检查Android SDK Platform-Tools安装** ADB位于Android SDK的`platform-tools`目录中。确保已通过SDK Manager安装此组件: - 打开Android SDK Manager,查看`Android SDK Platform-Tools`是否已勾选并安装。 - 默认安装路径示例: Windows: `C:\Android\android-sdk\platform-tools\` macOS/Linux: `~/Android/Sdk/platform-tools/`[^2] #### 2. **验证环境变量配置** - **检查PATH是否包含platform-tools路径** 若未将`platform-tools`目录添到系统PATH,命令行将无法识别`adb`命令: - **Windows** 命令行输入: ```cmd echo %PATH% ``` 确认输出中是否包含类似`C:\Android\android-sdk\platform-tools`的路径。 *若无,需手动添*: 1. 右键“此电脑” → 属性 → 高级系统设置 → 环境变量 2. 在“系统变量”中编辑`Path`,新增`platform-tools`的完整路径。 - **macOS/Linux** 命令行输入: ```bash echo $PATH ``` 确认是否包含`~/Android/Sdk/platform-tools`。 *若无,添以下行到`.bashrc`或`.zshrc`*: ```bash export PATH=$PATH:~/Android/Sdk/platform-tools ``` #### 3. **直接运行完整路径的ADB** - **绕过环境变量测试** 在命令行中输入ADB的完整路径(替换为实际路径): ```cmd C:\Android\android-sdk\platform-tools\adb.exe version ``` - 若成功显示版本:说明环境变量未正确配置。 - 若失败:ADB可能未安装或文件损坏,需重新安装SDK Platform-Tools。 #### 4. **检查ADB进程冲突** - **结束其他ADB实例** 第三方工具(如手机助手、模拟器)可能自ADB并占用端口: - **Windows** 任务管理器中结束所有`adb.exe`进程。 - **macOS/Linux** 终端执行: ```bash killall adb ``` #### 5. **重新安装或更新ADB** - **通过SDK Manager修复** 1. 打开Android SDK Manager,取消勾选`Android SDK Platform-Tools` → 点击“Apply”卸载。 2. 重新勾选并安装最新版本。 3. 重启命令行工具后再次尝试`adb version`。 - **手动下载替换** 从[Android开发者网站](https://developer.android.com/studio/releases/platform-tools)下载最新`platform-tools`包,替换原有目录。 --- ### 关键问题总结 | 问题原因 | 解决方法 | |-------------------------|--------------------------------------| | ADB未安装 | 通过SDK Manager安装Platform-Tools | | 环境变量缺失/错误 | 将`platform-tools`路径添到系统PATH | | 多ADB实例冲突 | 结束所有adb进程后重试 | | ADB文件损坏或版本过旧 | 重新安装或更新Platform-Tools | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值