EditText 的 TextWatcher 監聽器

EditText的TextWatcher監聽器

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

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);
			}
		}
	});
相關文章
相關標籤/搜索