12

SearchViewを備えたActionBarがあります。メニューボタンを選択すると、ドロップダウンリストの右側に非表示/オーバーフローメニュー項目が表示されます。ドロップダウンメニューが非表示になっている場合、SearchViewにフォーカスがあり、キーボードが表示されます。キーボードの表示を停止する方法はありますか(SearchViewがタッチされている場合を除く)?

よろしく、ジュリアス。

以下の追加コードを編集します:これが私がそれを初期化する方法です:

        SearchManager searchManager = (SearchManager) mActivity.getSystemService(Context.SEARCH_SERVICE);
        ((SearchView) mSearchView).setSearchableInfo(searchManager.getSearchableInfo(mActivity.getComponentName()));

        mSearchView.setIconifiedByDefault(mIconified);
        mSearchView.setOnQueryTextListener(this);
        mSearchView.setOnCloseListener(this);
        mSearchView.setFocusable(false);
        mSearchView.setFocusableInTouchMode(false);

        if(null!=mQuery)
            mSearchView.setQuery(mQuery, false);

編集2:

ユーザーが検索を開始したいときに私が行うことは次のとおりです。

    @Override
    public boolean onQueryTextSubmit(String query) {
        // Hide keyboard
        InputMethodManager imm = (InputMethodManager) mActivity.getSystemService(
                FragmentActivity.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(mSearchView.getWindowToken(), 0);

..。

        mSearchView.setFocusable(false);
        mSearchView.setFocusableInTouchMode(false);

        return true;
    }
4

6 に答える 6

31

mSearchView.clearFocus()searchViewの初期化を呼び出してみてください。私が同様の問題を抱えていたとき、それは私のために働きました。

于 2011-11-09T14:28:42.580 に答える
7

SearchViewを初期化するときに、SearchViewでsetFocusable(false)を呼び出してみてください。

于 2011-10-03T09:06:07.957 に答える
2

オプションメニューをフラグメントで作成するときに検索ビューをインスタンス化しましたが、上記の方法はどれもうまくいきませんでした。

ただし、onCreateOptionsMenu()でSearchViewのアイコン化された設定を設定するのではなく、次のようにフラグメントが再開したときに投稿に設定することで、SearchViewへの参照を保持することで問題を解決できました。

@Override
public void onResume() {
    super.onResume();
    getView().post(new Runnable() {
        public void run() {
            if (mFilterView.isIconfiedByDefault()) {
                mFilterView.setIconifiedByDefault(false);
                mFilterView.clearFocus();
            }
        }
    });
}
于 2014-07-23T14:14:29.903 に答える
1

別のビュー、理想的には結果ビューについては、requestFocus()を呼び出します。

_resultsFragment.getView().requestFocus();
于 2011-11-05T12:06:02.750 に答える
1

同じ問題で髪を抜いてきました。

android:focusable="false"を試しました。InputMethodManagerを試しました。焦点を合わせるためにダミービューを作成しようとしましたが、何も機能しませんでした。

私はついにonCreateOptionsMenu()内の次のコードでそれを解決しました:

final ViewTreeObserver observer = mSearchView.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
    @Override
    public void onGlobalLayout() {
        observer.removeOnGlobalLayoutListener(this);
        mSearchView.clearFocus();
    }
});

問題は、フラグメントのライフサイクルのすべての時点で、メニューがまだ作成されていないことでした。onCreateOptionsMenu()メソッドはonResume()の後に呼び出されていましたが、テストした一部のデバイスでのみ呼び出されていました。これは本当に奇妙なことです。

上記のコードは、ページの作成中にフォーカスが変更された後にフォーカスをクリアすることを確実にします。

これが他の誰かに役立つことを願っています。最初からこれを知ることで多くの時間を節約できたでしょう。

于 2014-05-22T19:56:46.980 に答える
0

XMLレイアウトファイル(使用している場合)でSearchViewを設定するときは、次のように使用します。

android:focusable="false"

このアプローチでは、SearchViewは、タッチするまでフォーカスを取得しません...コード内のどこで「初期化」したり、メニューを非表示にしたり、デバッグで発生しなかった可能性のあるその他のアクティビティに関係なく。これにより、電話をかけている場所を追跡する必要がなくなります。

setFocusable(false)//基本的に同じことをします

受け入れられた答えが示唆するように、コード内で複数回。

于 2013-07-10T01:33:54.930 に答える