EditText无内容变化/输入上限时的监听响应

EditText无内容变化/输入上限时的监听响应

有些情况下,EditText要求输入字数上限时进行处理,可是EditText通常只有三个方法来处理输入框中内容变化时的响应,分别是:

  1. beforeTextChanged() //内容变化前执行
  2. onTextChanged() //内容只要发生变化就执行
  3. afterTextChanged() //内容发生改变后执行

直接在上述的三种方法里没有办法在输入达到上限时继续响应键盘的输入,提醒用户已经达到上限了。因为在xml布局文件中设置了输入上限,使得继续在键盘上操作,输入框里的内容也不会发生改变,无法被上述方法监听到。

因此,我们在处理这类需求的时候应该想办法利用系统提供的这三种方法来完成,下面提供两种思路,选择一种即可。


1. 在onTextChanged中处理

这个回调是在内容发生变化时执行的,所以我们可以把最大上限多调一位,然后在每次输入的时候把内容的长度判断一遍,超过最大上限的部分截取,同时执行提示。

@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
	if(charSequence >= 11){
		Toast.makeText(xxxActivity.this,"输入字数超限",Toast.LENGTH_SHORT); //提示
		nickEditText.setText(charSequence.subSequence(0,11));  //截取前面11位
        nickEditText.setSelection(11); //设置光标到最后
	}
}

这样处理以后,每次超过11位的输入时都会提示用户,并且通过subSequence()方法截取前面11位字符,最后把光标移动到最后一位。

2. 在afterTextChanged中处理

这个回调是在内容改变后执行的,可以使用Editable对象,于是可以利用Editable对象的delete方法来处理多出来的字符。

@Override
public void afterTextChanged(Editable editable) {
              
 	editStart = editText.getSelectionStart();//获取输入前的光标位置
 	editEnd = editText.getSelectionEnd();//获取输入后的光标位置
	if (charSequence.length()>11){
    	ToastUtil.showDefaultToast(NicknameActivity.this,"输入字数超过限制");
    	editable.delete(editStart-1,editEnd); //删除最后一位
    	int tempSelection = editStart; //拿到之前的光标位置
    	editText.setText(editable);  
    	editText.setSelection(tempSelection);  //设置光标位置
    }
}

这样也能实现输入限制的同时,还能在达到限制以后监听到输入。


以上这两种方法都是通过把最大字符长度“拉长”来继续监听输入,再把多输入的内容删掉,来实现最大位继续输入的监听响应。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值