EditText 的 TextWatcher 监听器

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);
			}
		}
	});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值