android 手機號碼特殊顯示(帶空格或者* 號)
阿新 • • 發佈:2019-01-29
前言:
現在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;
}