textwatcher
Android EditText 通过textwatcher实现自动补全的注意点
背景
需求想要实现输入框在用户输入了一定文本的情况下 自动填充一个可能用户想要的结果,类似Chrome手机版的搜索框
实现
private class MyWatcher implements TextWatcher {
public void afterTextChanged(Editable s) {
Log.d(TAG, "doAfterTextChanged..");
if (一些可能防止自动补全的情况) {
return;
}
//为了防止快速输入的情况下重复调用,加一个延时
mhandler.removemessages(MSG_AUTO_COMPLETE);
mHandler.sendemptyMessageDelayed(MSG_AUTO_COMPLETE, DELAY_AUTO_COMPLETE);
}
public void beforeTextChanged(Charsequence s, int start, int count, int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
//这里可以设置一些标志位,用于防止自动补全,比如这里的识别用户按了删除按键,通过count==0来判断
mLastUrlEditWasDelete = (count == 0);
}
}
上面一些可能防止自动补全的情况有很多,一般有:
- 用户点了删除键;
- 正在处于上一次自动补全的过程中;
存在的兼容性问题
功能上线之后,发现国外的用户自动补全后点了删除,会再次自动补全,导致输入框无法删除,这个是很严重的bug,但是在测试和开发的过程中都没有发现,后来发现国外的用户用的是Gboard输入法,默认有一个文本输入建议,而开发和测试都用的国内的输入法,比如讯飞和搜狗等等。这里就出现了输入法的兼容问题,使用不同的输入法,点击删除时回调的TextWatcher的次数不同,在网上找了很多解决方案,最多的就是说让给EditText设置一个输入类型,也就是inputtype为textNoSuggestions,还有说用textVisiblePassword的,但是前者textNoSuggestions测试无用,无法控制Gboard不显示输入建议,后者textVisiblePassword会导致只能输入数字和英文,但是海外的用户并不都是输入英文的。所以这些都不是真正的解决方案 或者说不适用于目前的情况。
解决方案
在是否自动补全的地方下功夫,判断处于输入法的建议补全的时候就不自动补全
private boolean shouldAutoComplete() {
Editable text = getText();
return !isHandlingBATchInput()
&& BaseInputConnection.getComposingSpanEnd(text)
== BaseInputConnection.getComposingSpanStart(text);
}
缺憾,这样的话,只有用户点击了输入法内的搜索建议的词,输入内容才会出现在EditText中,但是此时不会执行自动补全操作,我的解决方案是
使用自定义的InputConnectionWrAPPer
重写EditText的onCreateInputConnection方法,
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
mInputConnectionwrapper.setTarget(super.onCreateInputConnection(outAttrs));
return InputConnectionWrapper;
}
InputConnectionWrapper mInputConnectionWrapper = new InputConnectionWrapper(null, true) {
@Override
public boolean finishComposingText() {
autoComplete(mLastSuggestion);
return super.finishComposingText();
}
};
在finishComposingText的时候调用一次自己写的autoComplete方法。
Have Fun~
相关阅读
在Android开发中,格式化输入框输入的手机号码是一个很常用的事情,比如输入13333333333,最终需要格式化成为133 3333 3333格式。这是
Android 颜色渲染(五) LinearGradient线性渲染
Android 颜色处理(五) LinearGradient线性渲染 相信很多人都看过歌词同步的效果, 一是竖直方向的滚动,另一方面是水平方面的歌
android中wrap_content、fill_content、match_content
wrap_content: 表示大小刚好足够显示当前控件里的内容 设置一个视图的尺寸为wrap_content将强制性地使视图扩展以显示全部内容
近日网速还算可以,于是乎决定下载一下Android源代码以供在家研究学习。下载之前先认识一下repo,整个Android源码是由很多个git项目
Android studio开发-第一个入门例子(十分详细)
举个栗子 实现功能:可以通过页面输入改变