开发中有种很可能会遇到的需求就是限制EditText的文本输入字数,例如微博就限制140字,如果只是限制输入的字数的话很简单,EditText有个属性叫android:maxLength,设置140就行了,但是当达到最大输入字数时还要提示用户达到了呢?这时候就需要自定义TextWatcher了,TextWatcher字如其意,就是文本观察器,用来观察文本的变化的,一般用在EditText中。好了,上代码:
布局中画个EditText就行了,先看自定义的TextWatcher,除了达到最大字数时会弹出Toast,同时也会将光标放置在文本最后:
/**
* 最大输入观察器
* 监听输入内容是否超出最大长度,并设置光标位置
*
* @author yuzhentao
*/
public class MaxInputTextWatcher implements TextWatcher {
private Context context;
private EditText editText = null;
private int maxLength = 0;
public MaxInputTextWatcher(Context context, EditText editText, int maxLength) {
this.context = context;
this.editText = editText;
this.maxLength = maxLength;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Editable editable = editText.getText();
int length = editable.length();//原字符串长度
if (length > maxLength) {//如果原字符串长度大于最大长度
int selectEndIndex = Selection.getSelectionEnd(editable);//getSelectionEnd:获取光标结束的索引值
String str = editable.toString();//旧字符串
String newStr = str.substring(0, maxLength);//截取新字符串
editText.setText(newStr);
editable = editText.getText();
int newLength = editable.length();//新字符串长度
if (selectEndIndex > newLength) {//如果光标结束的索引值超过新字符串长度
selectEndIndex = editable.length();
Toast.makeText(context, "最多只能输入" + selectEndIndex + "个字哦", Toast.LENGTH_SHORT).show();
}
Selection.setSelection(editable, selectEndIndex);//设置新光标所在的位置
}
}
@Override
public void afterTextChanged(Editable s) {
}
}
首先当然是实现TextWatcher了,会实现3个方法,一般我们都在onTextChanged()中操作,细节大家看代码就行。
然后就是主界面中去使用这个自定义的TextWatcher了:
/**
* 主界面
*
* @author yuzhentao
*/
public class MainActivity extends Activity {
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
context = this;
EditText et = (EditText) findViewById(R.id.edittext_activity_main);
et.addTextChangedListener(new MaxInputTextWatcher(context, et, 140));
}
}
通过addTextChangedListener()来使用这个自定义的TextWatcher,输入自己想要的最大输入字数即可。
一个很简单的功能,希望对大家有所帮助。
效果图: