80

現在SearchView、アプリのアクション バーに があります。検索アイコンをクリックすると、期待どおりにSearchView展開し、キーボードがポップアップします。ボックス内の「X」をクリックすると、期待どおりSearchViewに閉じますSearchView。ただし、SearchViewをアクティブにして「戻る」ボタンを押すと、アプリが終了します。これは正しい動作ですが、私が今やろうとしているのは、戻るボタンの押下をキャプチャしSearchView、が表示されているときに (私のアプリではなく) を閉じるSearchViewことです。SearchView OnCloseListener()戻るボタンを押してプログラムで呼び出す方法はありますか? たとえば、次のようなものです。

// On a back button press, if we are currently searching,
// close the SearchView. Otherwise, invoke normal back button
// behavior.
public boolean onKeyDown(int keyCode, KeyEvent event) {
   if (keyCode == KeyEvent.KEYCODE_BACK) {
        if (isSearchViewVisible) {
            SearchView searchView = (SearchView) menu.findItem(R.id.searchBox)
               .getActionView();

            // This method does not exist
            searchView.invokeClose();
            return true;
        }
    }
    return super.onKeyDown(keyCode, event);
}
4

15 に答える 15

166

@MarcinOrlowskiの回答に基づいて、次も使用できます。

@Override
public void onBackPressed() {
    if (!searchView.isIconified()) {
        searchView.setIconified(true);
    } else {
        super.onBackPressed();
    }
}
于 2013-07-22T08:02:35.473 に答える
57

使用する

searchView.setIconified(true)

MenuItemCompat.collapseActionViewも使用しました

MenuItemCompat.collapseActionView(menuItem)

編集済み

このメソッドは、API レベル 26.1.0 で廃止されました。collapseActionView() を直接使用してください。

MenuItem#collapseActionView()

于 2013-09-25T11:49:44.120 に答える
44

これを行う簡単な方法があります。

@Override
public void onBackPressed() {
    if (!searchView.isIconified()) {
        searchView.onActionViewCollapsed();
    } else {
        super.onBackPressed();
    }
}

または使用:

myToolBar.collapseActionView();

これにより、戻るを押す前に searchView が折りたたまれ、戻るアクションが呼び出されます。

どちらのソリューションも機能します。

于 2015-05-05T09:15:01.343 に答える
36

これは私のためにそれを行う唯一のことです:

  toolbar.collapseActionView();
于 2016-07-02T19:51:05.483 に答える
23

BACK ボタンのオーバーライドをインターセプトするにはonBackPressed()( docs を参照)

@Override
public void onBackPressed() {

    if (isSearchViewVisible) {
        SearchView searchView = (SearchView) menu.findItem(R.id.searchBox)
           .getActionView();

        // This method does not exist
        searchView.invokeClose();
    } else {
        super.onBackPressed();
    }
}

編集

ドキュメントは言う

必要に応じて、MenuItem で expandActionView() および collapseActionView() を呼び出して、独自のコードでアクション ビューを展開または折りたたむことができます。

于 2013-07-06T19:17:55.147 に答える
2

使用する:

searchView.setIconified(true);
于 2015-06-12T13:24:04.547 に答える
2

これにはメソッドを使用する必要はありませんonBackPressed()!! 私は解決策を見つけました.SearchView自体が戻るボタンの押下イベントを処理するように、以下で述べたようにのみ実行してください。

あなたのonCreateOptionsMenu()方法の中で、

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    MenuItem menuItem = menu.findItem(R.id.action_search);
    SearchView searchview = (SearchView) menuItem.getActionView();
    searchview.setIconifiedByDefault(true);
    searchview.setQueryHint("Enter your keyword");
    searchview.setOnQueryTextListener(this); 
    super.onCreateOptionsMenu(menu, inflater);
}

menu.xmlにshowAsAction属性を追加し、その値を次のように設定します"always|collapseActionView"

<item
    android:id="@+id/action_search_item"
    android:title="Search"
    android:icon="@drawable/ic_search_logo"
    app:showAsAction="always|collapseActionView"
    app:actionViewClass="android.support.v7.widget.SearchView"/>

そして、あなたは行く準備ができています;)

PS - 私は長い間解決策を探していましたが、今では解決策を見つけました。

于 2019-01-05T18:24:39.053 に答える
0

私のやり方:

  1. CustomSearchView クラスを作成する
    public class CustomSearchView は SearchView を拡張します{
        public CustomSearchView(最終コンテキスト コンテキスト) {
            スーパー(コンテキスト);
            this.setIconifiedByDefault(true);
        }

        @オーバーライド
        public boolean dispatchKeyEventPreIme(KeyEvent イベント) {
            if (event.getKeyCode() == KeyEvent.KEYCODE_BACK &&
                event.getAction() == KeyEvent.ACTION_UP) {
                this.onActionViewCollapsed();
            }
            super.dispatchKeyEventPreIme(イベント) を返します。
        }
    }

  1. actionViewClass を追加
    <項目
        android:id="@+id/menu_search"
        android:title="@string/menu_search"
        android:icon="@drawable/ic_search"
        android:showAsAction="collapseActionView|ifRoom"
        android:actionViewClass="com.myapp.CustomSearchView"/>
  1. CustomSearchView を onCreateOptionsMenu に作成します
    CustomSearchView searchView = (CustomSearchView)menu.findItem(R.id.menu_search).getActionView();
于 2015-08-19T04:13:14.597 に答える
0

も使えますcollapseActionView。戻るボタンを自動的に処理し、SearchView を折りたたみます

<item
      android:id="@+id/action_search"
      android:icon="@drawable/ic_magnify"
      android:title="@string/action_title_search"
      app:actionViewClass="android.support.v7.widget.SearchView"
      app:showAsAction="ifRoom|collapseActionView" />
于 2016-10-02T10:54:36.890 に答える
0

以下は私のために働いた。ユーザーが戻るボタンをクリックしたときに、Jetpack NavigationView の Fragment から検索ビューを閉じようとしています -

requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), new OnBackPressedCallback(true) { @Override public void handleOnBackPressed() {

        try {
            DashboardActivity activity = (DashboardActivity) getActivity();
            if (activity!=null) {
                if (!activity.mSearchView.isIconified()) {
                    activity.mSearchView.setQuery("",false);
                    activity.mSearchView.setIconified(true);
                } else {
                    NavController navController = Navigation.findNavController(activity, R.id.nav_host_fragment);
                    navController.popBackStack();
                }
            }

        }catch (Exception e){
            e.printStackTrace();
        }
    }
});
于 2020-10-07T04:08:56.897 に答える
0

メソッドで関数を使用していない場合はonBackPressed()、アクティビティから削除して、 SearchViewそれ自体がonBackPressイベントを処理できるようにします。

私はSearchViewを次のように使用しています

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchview = (SearchView) MenuItemCompat.getActionView(searchItem);
    searchview.setIconifiedByDefault(true);
    searchview.setOnQueryTextListener(this);
    searchview.setSubmitButtonEnabled(true);  
    searchview.setQueryHint("Search Here"); 
    super.onCreateOptionsMenu(menu, inflater);
}

そして私のmenu.xmlは次のように

<item
    android:id="@+id/action_search"
    android:icon="@drawable/search_tool"
    android:orderInCategory="1"
    android:title="Search" 
    app:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="always|collapseActionView"/>
于 2015-12-22T09:09:36.707 に答える