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

前言:

现在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;
    }
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值