背景
在开发一个IM 的Lib中遇到EditText的问题:
在限制输入30字符长度(无论中英)的情况下若复制粘贴长文本容易在低端机卡住的问题
原先对长度的限制是采用对输入监听的方式,不能得到有效的解决。
//限制输入长度为30,无论中英文
mEtInput.addTextChangedListener(new TextWatcher() {
private CharSequence temp;
private boolean isEdit = true;
private int selectionStart;
private int selectionEnd;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
temp = s;
if (TextUtils.isEmpty(s)) {
mTvConfirm.setBackground(unSendIcon);
mTvConfirm.setClickable(false);
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mTvConfirm.setBackground(sendIcon);
mTvConfirm.setClickable(true);
}
@Override
public void afterTextChanged(Editable s) {
selectionStart = mEtInput.getSelectionStart();
selectionEnd = mEtInput.getSelectionEnd();
if (temp.length() > 30) {
s.delete(selectionStart - 1, selectionEnd);
mEtInput.setText(s);
}
String message = s.toString().trim();
if (TextUtils.isEmpty(message)) {
mTvConfirm.setBackground(unSendIcon);
mTvConfirm.setClickable(false);
} else {
mTvConfirm.setBackground(sendIcon);
mTvConfirm.setClickable(true);
}
}
});
解决方式
其中最大多数都推荐使用Inputfilter
- 最终实现
// 添加输入框的筛选条件
private void addEditTextFilter(InputFilter[] inputFilters) {
if(null != mEtInput){
InputFilter[] editFilters = mEtInput.getFilters();
InputFilter[] newFilters = inputFilters;
// 将原来旧的筛选数组更新为最新的
System.arraycopy(editFilters, 0, newFilters, 0, editFilters.length);
// 设置最新筛选要求
mEtInput.setFilters(newFilters);
}
}
移除原先的监听逻辑操作:
//限制输入长度为30,无论中英文
mEtInput.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
if (TextUtils.isEmpty(s)) {
mTvConfirm.setBackground(unSendIcon);
mTvConfirm.setClickable(false);
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mTvConfirm.setBackground(sendIcon);
mTvConfirm.setClickable(true);
}
@Override
public void afterTextChanged(Editable s) {
String message = s.toString().trim();
if (TextUtils.isEmpty(message)) {
mTvConfirm.setBackground(unSendIcon);
mTvConfirm.setClickable(false);
} else {
mTvConfirm.setBackground(sendIcon);
mTvConfirm.setClickable(true);
}
}
});
在initview的时候调用该方法即可:
// 添加输入的筛选条件 限制输入长度
addEditTextFilter(new InputFilter[] {new InputFilter.LengthFilter(maxInputLength)});
最终在华为nova 3测试 (相对现在来说较低端的手机)不会显得卡顿。