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

自動補完を防止する可能性がある場合は、次のようなものがあります.
  • ユーザーは削除キーを押した.
  • は前回の自動補完の過程にある.

  • 互換性の問題
    机能がオンラインになった后、国外のユーザーが自动的に补完して削除することを発见して、再び自动的に补完して、入力枠が削除できないことを招いて、これはとても深刻なバグで、しかしテストと开発の过程の中ですべて発见していないで、后で国外のユーザーが使うのがGboard入力法であることを発见して、デフォルトは1つのテキストの入力の提案があって、开発とテストはすべて使う国内の入力法で、例えば、訊飛や捜索犬などです.ここでは入力法の互換性の問題が発生し,異なる入力法を用いて削除をクリックする際にコールバックする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~