EditText的TextWatcher监听器
public void beforeTextChanged(CharSequence s, int start, int count, int after)
s:修改之前的文本
start:文本开始位置
count:之前文本被修改的个数
after:新增文本的个数
public void onTextChanged(CharSequence s, int start, int before, int count)
s:修改之后的文本
start:开始位置
before:之前文本被修改的个数
count:新增文本的个数
public void afterTextChanged(Editable s)
s:最终的文本
例子:
文本:1(新增:从0位置开始)
D/xx: beforeTextChanged :: s=,start=0, count=0, after=1
D/xx: onTextChanged :: s=1,start=0, before=0, count=1
D/xx: afterTextChanged :: s=1
文本:1234 变到 12345(新增)
D/xx: beforeTextChanged :: s=1234,start=4, count=0, after=1
D/xx: onTextChanged :: s=12345,start=4, before=0, count=1
D/xx: afterTextChanged :: s=12345
文本:12345 变到 1234(删除)
D/xx: beforeTextChanged :: s=12345,start=4, count=1, after=0
D/xx: onTextChanged :: s=1234,start=4, before=1, count=0
D/xx: afterTextChanged :: s=1234
文本:1234 变到 12354(插入)
D/xx: beforeTextChanged :: s=1234,start=3, count=0, after=1
D/xx: onTextChanged :: s=12354,start=3, before=0, count=1
D/xx: afterTextChanged :: s=12354
文本:12354 变到 16354(替换 等于 删除旧的,新增新的)
D/xx: beforeTextChanged :: s=12354,start=1, count=1, after=1
D/xx: onTextChanged :: s=16354,start=1, before=1, count=1
D/xx: afterTextChanged :: s=16354
文本:16354 变到 777(粘贴)
D/xx: beforeTextChanged :: s=16354,start=0, count=5, after=3
D/xx: onTextChanged :: s=777,start=0, before=5, count=3
D/xx: afterTextChanged :: s=777
EditText限制字符
第一种方法
private int MAX_TAG_LENGTH = 10; // 最多字符数
editText.addTextChangedListener(new TextWatcher() {
private int startPos; // 修改的开始位置
private int modifyNum; // 新增字符的个数
[@Override](https://my.oschina.net/u/1162528)
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
startPos = start;
modifyNum = after;
}
[@Override](https://my.oschina.net/u/1162528)
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
[@Override](https://my.oschina.net/u/1162528)
public void afterTextChanged(Editable s) {
if (s.length() > maxNum) { // 超出长度,删除多余字符
int beyondNum = s.length() - maxNum; // 超出的个数
int delPos = startPos + modifyNum - beyondNum; // 删除的开始位置
s.delete(delPos, delPos + beyondNum); // 删除多余字符
}
}
});
第二种方法
private int maxNum = 85; // 默认最大数为85
etMemoText.addTextChangedListener(new TextWatcher() {
private CharSequence inputText; // 修改后的文本
[@Override](https://my.oschina.net/u/1162528)
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
[@Override](https://my.oschina.net/u/1162528)
public void onTextChanged(CharSequence s, int start, int before, int count) {
inputText = s;
}
@Override
public void afterTextChanged(Editable s) {
// 当前文本长度
int length = inputText.length();
// 获取光标位置
int selectionStart = etMemoText.getSelectionStart();
int selectionEnd = etMemoText.getSelectionEnd();
if(length > maxNum){
// 删除多余文字
s.delete(selectionStart-1, selectionEnd);
// 设置修改后的文字
etMemoText.setText(s);
// 确定光标应显示的位置
int tempSelection = selectionStart-1;
if(tempSelection >= etMemoText.getText().toString().length()){
tempSelection = etMemoText.getText().toString().length();
}
//设置光标位置
etMemoText.setSelection(tempSelection);
}
}
});