public void beforeTextChanged(CharSequence s, int start, int count, int after)ide
s:修改以前的文本.net
start:文本開始位置code
count:以前文本被修改的個數get
after:新增文本的個數input
public void onTextChanged(CharSequence s, int start, int before, int count)it
s:修改以後的文本io
start:開始位置table
before:以前文本被修改的個數List
count:新增文本的個數select
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
第一種方法
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); } } });