TextWatcher使用
TextWatcher作用为监测键盘输入并根据输入内容展示不同显示效果
接口分析(按回调顺序)
其中有4个参数:
* CharSequence s:文本改变之前的内容
* int start : 被替换文本区域起点位置
* int count:将被替换的文本区域字符数目
* int after:替换后的文本字符数目
文本 s 中的 start 位置之后的 count 个字符将被替换为 after 个新的字符
注:s为替换前的文本
2. 文本改变时
其中有4个参数:
CharSequence s:文本改变之后的内容
int start : 被替换文本区域起点位置,setText时是替换所有内容,此时数值为0
int before:被替换之前的文本区域字符数目
int count:替换后的文本字符数目
文本 s 中的 start 位置之后的 before 个字符已经被替换为 count 个新的字符
注:s为替换后的新文本
3. 文本改变后
其中有1个参数:
Editable s:文本改变之后的内容
TextWatcher使用
//所有继承自TextView的类textView.addTextChangedListener(new TextWatcher() {@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void afterTextChanged(Editable s) {}});注意事项 :
在回调方法中获取的新字符串虽然已经设置到TextView中,但是还未在UI界面中更新.
重要 :
经网上查阅,几乎没有人提到过回调方法过程中UI是否已经更新数据,而笔者比较在意是否处理数据导致页面闪烁.
发现有人已经注意到这一点,其情景为短时间内多次触发回调,但是页面只显示了最后一次数据结果,而评论中却归结为处理速度快导致分辨不出闪烁.
笔者在回调方法中加入延时,而UI更新时间为3个回调方法结束后.判断为只有在数据处理完毕后才会显示在UI上.
如若判断失误欢迎大家指正有2种情况会触发TextWatcher的3个回调方法,setText()和EditText键盘输入
- 如果在回调方法中调用setText(),会进入无限循环,需要增加判断条件
- afterTextChanged中去改变Editable s的值会触发TextWatcher的3个回调方法,会进入无限循环,需要增加判断条件
- Editable s和CharSequence s获取的数据为去除空格和回车之后字符串.
应用场景
InputFilter过滤
InputFilter是系统提供的一个接口,是一个过滤器,修改传入的字符串,返回值类型为CharSequence.
自定义InputFilter
public class mInputFilter implements InputFilter {@Overridepublic CharSequence filter(CharSequence source, int start, int end,Spanned dest, int dstart, int dend) {return null;} }可以看到只需要实现filter()方法,而方法会传入6个参数,下面详细解释每个参数的含义
CharSequence source 用来替换的新的字符串,包括键盘输入/setText()/粘贴的内容
int start source的起始位置
int end source的结束位置
以上3个参数描述出用来替换的新的字符串
Spanned dest 修改前的字符串,setText()时dest为EMPTY_SPANNED,添加或修改时为输入框内的文本内容
int dstart dest选中范围的起始位置
int dend dest选中范围的结束位置
设置过滤器,inputFilters为InputFilter 数组.
注意事项
根据源码得知,当返回值为null时,不对输入数据进行任何过滤操作,数据不变
总结
以上是生活随笔为你收集整理的TextWatcher使用的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 单片机c语言串口中断函数,12手把手教你
- 下一篇: 工作223:状态管理里面取值