输入文本框中输入手机号自动添加空格以及在手机号中间的空格处删除时自动删除末尾号码其他位置则删除直接删除实现

来源:互联网 发布:mac 无法识别android 编辑:程序博客网 时间:2024/06/01 08:33

项目2.0研发中,在登录和注册时,在填写手机号码时,产品要求填写手机号时交互的方式和其他一款应用一样(具体什么应用,我也不太清楚)。在看过产品拿其他应用演示的效果后,就开始了研发。


好了,不瞎扯了,还是说下交互的方式吧。

在用户输入手机号的第四位时,需要自动在第三位和第四位之间加上一个空格,方便用户识别手机号。在输入第8位时,效果与前面的一样。当用户删除手机号时,如果用户是在添加的空格之处删除时,则自动将最后一位号码删除,如果不是在添加的空格处删除,则直接删除。如果在空格之处删除时,空格后面只有一位号码时则将该号码和空格一起删除。交互方式就是这样的,下面看下代码实现吧。


/**
 * 登录界面
 * 
 * @author Administrator ll
 * @date 2016-8-25
 */
public class LoginActivity extends MyBaseActivity implements OnClickListener,
OnTitleClickListener {
/** 手机号 */
private EditText et_tel = null,

    et_pwd = null;// 密码
/** 清空按钮和显示手机号格式正确转换的标志 */

private boolean isOnTextChange = false,// onTextChanged方法被调用的次数监听开关
isDeleteMiddle = false;// 删除字符之间的字符标志
private String lastTel = "";// 上次记录的手机号


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
findView();
initData();
setListener();
}


@Override
protected void findView() {
et_pwd = (EditText) findViewById(R.id.login_pwd);
et_tel = (EditText) findViewById(R.id.login_tel);
iv_check_clear = (ImageView) findViewById(R.id.login_check_clear);
}


@Override
protected void initData() {

}

@Override
protected void setListener() {
et_pwd.addTextChangedListener(new TextWatcher() {


@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
}


@Override
public void beforeTextChanged(CharSequence arg0, int arg1,
int arg2, int arg3) {
}


@Override
public void afterTextChanged(Editable arg0) {
// 密码文本框为空
if (!TextUtils.isEmpty(et_pwd.getText().toString().trim()))
showNext();// 显示或者隐藏登录按钮
}
});
et_pwd.setOnEditorActionListener(new OnEditorActionListener() {


@Override
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
if (actionId == KeyEvent.ACTION_DOWN
|| actionId == EditorInfo.IME_ACTION_DONE) {
int ev_len = et_pwd.getText().toString().trim().length();
if (ev_len < 6 || ev_len > 16) {
toast(ll_bg, "密码为6-16位,请重试!", true);
return true;
}
}
return true;
}
});
et_tel.addTextChangedListener(new TextWatcher() {


@Override
public void onTextChanged(CharSequence s, int start, int before,
int arg3) {
if (s == null || s.length() == 0)// 当没有输入内容时,直接返回
return;
// 当调用次数开关是关闭状态时,执行下面的
if (!isOnTextChange) {// 第一次调用onTextChanged方法,当对输入框进行修改是(删除或者获取输入内容),该方法又会被调用,为了防止后面的设置文本时再调用该方法,所以在此加了个开关
isDeleteMiddle = false;// 默认设置删除的字符是非空格和字符之间的
StringBuilder sb = new StringBuilder();// 设置可追加长度的字符串
if (before == 1) {// 删除字符,before为1是删除字符,为0是增加字符
int lastLenght = lastTel.length();// 获取上次记录的字符串长度
sb.append(lastTel);// 添加上次的字符串
if (start == 9)// 删除的是第二个字符之后两字符之间的位置
if (lastLenght == 10) {// 字符串长度为10,此时是第二个空格后只有一个字符,此时删除字符时将该空格和后面的那个字符一起删除
sb.delete(8, sb.length());// 删除空格和后面的字符
isDeleteMiddle = false;// 不是删除字符中间的字符
} else {// 长度大于10,因为删除的起始位置是9,说明总长度必然大于9,长度又不为10,所以必然大于10
sb.deleteCharAt(start);// 删除中间的字符
isDeleteMiddle = true;// 是删除中间的字符
}
else if (start == 8) {// 删除的是第二个空格处
if (lastLenght > 10)// 说明空格之后字符大于等于2
sb.deleteCharAt(sb.length() - 1);// 删除最后面的
else
// 说明空格之后只有一个字符
sb.delete(8, sb.length());// 空格和字符一起删除
isDeleteMiddle = false;// 删除的不是字符之间的
} else if (start == 4)// 第一个空格之后两字符之间的位置
if (lastLenght == 5) {// 一下两个else if的注释请参见上面两个
sb.delete(3, sb.length());
isDeleteMiddle = false;
} else {
sb.deleteCharAt(start);
isDeleteMiddle = true;
}
else if (start == 3) {
if (lastLenght > 5)
sb.deleteCharAt(sb.length() - 1);
else
sb.delete(3, sb.length());
isDeleteMiddle = false;
} else {// 删除的是非特殊位置
sb.deleteCharAt(start);
isDeleteMiddle = true;// 是字符中间的
}
iv_check_clear.setVisibility(View.GONE);
if (sb.length() == 1)// 当内容
lastTel = "";
} else {// 添加字符
if (!lastTel.equals(s.toString()))// 上次的字符与当前字符不相同
for (int i = 0, len = s.length(); i < len; i++)
// 一次添加当前所有的字符
if ((i != 3 || i != 8) && s.charAt(i) == ' ')// 如果第4位或者第9位是空格,则跳过
continue;
else {// 不为空则添加
sb.append(s.charAt(i));// 添加字符
if ((sb.length() == 4 || sb.length() == 9)
&& sb.charAt(sb.length() - 1) != ' ')// 第4位或第9位不是空格
sb.insert(sb.length() - 1, ' ');// 插入空格
}
isDeleteMiddle = false;// 不是删除
}
isOnTextChange = true;// 记录onTextChanged方法已经调用过一次,将开关开启
showFormTel(sb.toString(), isDeleteMiddle, start);// 显示变化后的手机号和光标位置
if (!lastTel.equals(""))
lastTel = sb.toString();// 更新手机号记录
else if (sb.length() > 1)
lastTel = sb.toString();
if (lastTel.length() == 13
&& CommonTool.isTel(lastTel.replace(" ", ""))) {
iv_check_clear.setVisibility(View.VISIBLE);// 手机号文本输入框内容不为空,显示右侧的按钮
isChange = true;
CommonTool.showInputMethod(getApplicationContext(),
et_pwd);
showNext();
return;// 结束
}
sb = null;// 释放内存
} else {
isOnTextChange = false;// 关闭开关,这样才不会影响下次点击软键盘时的监听
}
}


@Override
public void beforeTextChanged(CharSequence arg0, int arg1,
int arg2, int arg3) {
}


@Override
public void afterTextChanged(Editable arg0) {

}
});
}


/**
* 显示格式化后的手机号和光标位置

* @param sb
*            手机号
* @param isSkip
*            光标移至尾部的开关标志
* @param start
*            光标位置
*/
private void showFormTel(String sb, boolean isSkip, int start) {
if (!lastTel.equals(sb)) {// 上次记录的手机号和当前显示的不一致,需要更新手机号
et_tel.setText(sb);// 更新手机号
if (!isSkip)// 需要移至尾部
et_tel.setSelection(sb.length());// 光标移至尾部
else
et_tel.setSelection(start);// 光标在删除的字符的前一个位置
}
}


/**
* 显示或隐藏登录按钮

*/
private void showNext() {
// 判断密码输入框的长度是否大于5,且手机号是正确的
if (et_pwd.getText().toString().trim().length() > 5 & isChange)
iv_login.setVisibility(View.VISIBLE);// 显示登录按钮
else
iv_login.setVisibility(View.GONE);// 隐藏按钮
}

/**
* 输入内容校验

* @return
*/
private boolean checkInput() {
if (TextUtils.isEmpty(et_tel.getText().toString().trim())) {// 手机号为空
toast(ll_bg, "手机号不能为空", true);// 提示
return false;
}
if (TextUtils.isEmpty(et_tel.getText().toString().trim())) {// 手机号格式不正确
toast(ll_bg, "手机号格式不正确", true);// ..
return false;
}
return true;
}

@Override
protected void releaseMemory() {
et_pwd = null;
et_tel = null;
}
}

代码是从项目中拷贝出来的,已经删除了与博文内容无关的代码部分。

0 0
原创粉丝点击