必威体育Betway必威体育官网
当前位置:首页 > IT技术

Android EditText 通过TextWatcher实现自动补全的注意点

时间:2019-08-31 10:11:04来源:IT技术作者:seo实验室小编阅读:52次「手机版」
 

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);
        }
    }

上面一些可能防止自动补全的情况有很多,一般有:

  1. 用户点了删除键;
  2. 正在处于上一次自动补全的过程中;

存在的兼容性问题

功能上线之后,发现国外的用户自动补全后点了删除,会再次自动补全,导致输入框无法删除,这个是很严重的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~

相关阅读

EditText格式化输入内容

在Android开发中,格式化输入框输入的手机号码是一个很常用的事情,比如输入13333333333,最终需要格式化成为133 3333 3333格式。这是

Android 颜色渲染(五) LinearGradient线性渲染

Android 颜色处理(五) LinearGradient线性渲染   相信很多人都看过歌词同步的效果, 一是竖直方向的滚动,另一方面是水平方面的歌

android中wrap_content、fill_content、match_content

  wrap_content: 表示大小刚好足够显示当前控件里的内容 设置一个视图的尺寸为wrap_content将强制性地使视图扩展以显示全部内容

Android 源码下载 到 编译全过程

近日网速还算可以,于是乎决定下载一下Android源代码以供在家研究学习。下载之前先认识一下repo,整个Android源码是由很多个git项目

Android studio开发-第一个入门例子(十分详细)

                                                     举个栗子 实现功能:可以通过页面输入改变

分享到:

栏目导航

推荐阅读

热门阅读