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()。

菜单项#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()请参阅文档

@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 回答
20

如果您在 searchView 上有输入

mSearchView.setIconified(true);

只会清除文本。

关闭 searchView 的正确方法是

mSearchView.onActionViewCollapsed();
于 2016-11-24T14:58:22.083 回答
2

我更喜欢!searchView.isIconified()在方法if(isSearchViewVisible)内部,因为当您在其中添加了您希望在按下后退按钮时显示的onBackPressed()片段时,选项 2 不起作用。fragmentmanager's backstack

于 2013-09-11T23:45:16.640 回答
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 回答
1

在科特林;

首先清除输入的文本(可选)

searchView.isIconified = true

二、关闭searchview

searchView.onActionViewCollapsed()

Exstra,以编程方式打开搜索视图

searchView.onActionViewExpanded()
于 2021-06-30T10:19:22.527 回答
0

If you are not use any function in onBackPressed() method ,remove it from your Activity.So that the SearchView itself handle the onBackPress event.

I am using SearchView as

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

and my menu.xml as follows

<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 回答
0

我的方式:

  1. 创建 CustomSearchView 类
    公共类 CustomSearchView 扩展 SearchView{
        公共CustomSearchView(最终上下文上下文){
            超级(上下文);
            this.setIconifiedByDefault(true);
        }

        @覆盖
        公共布尔dispatchKeyEventPreIme(KeyEvent事件){
            if (event.getKeyCode() == KeyEvent.KEYCODE_BACK &&
                event.getAction() == KeyEvent.ACTION_UP) {
                this.onActionViewCollapsed();
            }
            return super.dispatchKeyEventPreIme(event);
        }
    }

  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. 在 onCreateOptionsMenu 中创建 CustomSearchView
    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

最有效的解决方案:

MenuItem menuItem = ....//
menuItem.collapseActionView();
于 2021-10-05T18:11:12.013 回答
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 回答