Android EditText TextWatcherによる自動補完の注意点
4185 ワード
Android EditText TextWatcherによる自動補完の注意点
私のブログの文章は住所に対応します
背景
需要実現入力ボックスユーザーが一定のテキストを入力した場合、ユーザーが望む可能性のある結果を自動的に入力し、Chrome携帯版の検索ボックスに似ている.
インプリメンテーション
自動補完を防止する可能性がある場合は、次のようなものがあります.ユーザーは削除キーを押した. は前回の自動補完の過程にある.
互換性の問題
机能がオンラインになった后、国外のユーザーが自动的に补完して削除することを発见して、再び自动的に补完して、入力枠が削除できないことを招いて、これはとても深刻なバグで、しかしテストと开発の过程の中ですべて発见していないで、后で国外のユーザーが使うのがGboard入力法であることを発见して、デフォルトは1つのテキストの入力の提案があって、开発とテストはすべて使う国内の入力法で、例えば、訊飛や捜索犬などです.ここでは入力法の互換性の問題が発生し,異なる入力法を用いて削除をクリックする際にコールバックするTextWatcherの回数が異なり,ネット上で多くの解決策を探したが,最も多かったのはEditTextに入力タイプを設定させること,すなわちinputTypeがtextNoSuggestions,さらにtextVisiblePasswordを用いることであったが,前者のtextNoSuggestionsテストは不要であり,Gboardが入力推奨を表示しないことを制御できません.後者のtextVisiblePasswordは数字と英語しか入力できませんが、海外のユーザーは英語を入力しているわけではありません.これらは真の解決策ではなく、現在の状況には適用されません.
ソリューション
自動補完の有無を工夫し、入力方式の推奨補完があると判断した場合は自動補完しない
残念なことに、このような場合、ユーザーが入力メソッド内の検索推奨の語をクリックした場合にのみ、入力内容がEditTextに表示されますが、この場合自動補完操作は実行されません.私の解決策は、カスタムInputConnectionWrapperを使用してEditTextのonCreateInputConnectionメソッドを書き換えることです.
finishComposingTextで自分で書いたautoCompleteメソッドを呼び出します.
Have Fun~
私のブログの文章は住所に対応します
背景
需要実現入力ボックスユーザーが一定のテキストを入力した場合、ユーザーが望む可能性のある結果を自動的に入力し、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~