最近的开发中遇到一个需求:有很多输入内容,有些有单位,有些没有单位,需要在有单位的输入值后面加上单位,没单位的就不用管,因为有些没单位,所有UI说是专门设计一个显示单位的元素不统一,让自己想办法在输入框中加入单位就行了。于是就开干吧!
思路:
1.要扩展原有的TextWatcher,在afterTextChanged中加入咱们的单位。
2.自动填充单位后要将光标定位在咱们的单位前面。
3.对外暴露一个方法通知外部内容变化了。
下面来看具体代码,注释写得比较详细,这里就不在一一介绍了,直接复制可用!
import android.text.Editable;
import android.text.Selection;
import android.text.TextWatcher;
import android.widget.EditText;
/**
* date : 2020/3/12.
* description:自定义textwatcher,自动往后面/加东西
*/
public class MyTextWatcher implements TextWatcher {
private String lastStr;//往后面加的单位
private EditText editText;//editText对象,用作在咱们要向内容后面加上单位时先移除监听,避免死循环
TextChangeListener listener;//对外提供的接口,通知外部我有内容变化
public MyTextWatcher(String lastStr,EditText editText,TextChangeListener listener) {
this.lastStr = lastStr;
this.editText=editText;
this.listener=listener;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (s != null) {
editText.removeTextChangedListener(this);//移除输入监听,避免陷入死循环
if (s.toString().trim().equals(lastStr)) {
//当此时内容是单位的时候,将edittext置为空
editText.setText("");
} else {
//当前内容不是/不只是单位
String ss=s.toString();
//辅助判断单位存不存在/存在的位置
int len=ss.length()-lastStr.length();
if (len>0 && ss.substring(ss.length()-lastStr.length(),ss.length()).equals(lastStr)){
//如果单位就在最后,不需要做任何事情
}else {
//当用户自己将光标置到单位后面时,输入的内容就会在单位后面,此时将前面的单位去掉,将单位放到最后
ss=ss.toString().replace(lastStr, "") + lastStr;
editText.setText(ss);
}
//此时就为咱们正常的内容了,检查如果需要向外通知,那么久通知外部
if (listener!=null){
listener.onTextChange(ss);
}
//这里得到光标应该在的位置(单位前面)
int index=ss.length()-lastStr.length();
//设置光标的位置
Selection.setSelection(editText.getText(), index<0?0:index);
}
//前面将监听移除过来,这里需要重新进行监听
editText.addTextChangedListener(this);
}
}
/**
* 对外通知的接口
*/
public interface TextChangeListener{
void onTextChange(String s);
}
}
如有我没发现/考虑到的问题欢迎指正!