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