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; // 默认最大数为85etMemoText.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); } } });