版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/android_freshman/article/details/79556900
前言:
现在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;
}