【问题标题】:How do I close a SearchView programmatically?如何以编程方式关闭 SearchView?
【发布时间】:2013-07-04 13:56:21
【问题描述】:

我目前在我的应用的操作栏中有一个SearchView。当我单击搜索图标时,SearchView 会展开并且键盘会按预期弹出。单击SearchView 框中的“X”会按预期关闭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);
}

【问题讨论】:

标签: android searchview


【解决方案1】:

根据@MarcinOrlowski 的回答,您也可以使用:

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

【讨论】:

  • 重要的是,如果您设置了 app:showAsAction="always",上述解决方案将不起作用
  • 确保设置 searchView.setQuery("", false);为了使 searchView.setIconified(true);上班
  • 使用 searchView.setQuery("", false);在 searchView.setIconified(true) 之前;为我工作,如果你连续放置 2 个 searchView.setIconified(true);为我工作。
【解决方案2】:

使用

searchView.setIconified(true)

我也用过MenuItemCompat.collapseActionView

MenuItemCompat.collapseActionView(menuItem)

已编辑

此方法在 API 级别 26.1.0 中已弃用。直接使用collapseActionView()。

MenuItem#collapseActionView()

【讨论】:

  • 这仅在您设置 app:showAsAction="ifroom|collapseActionView" 时有效。
  • 现在不推荐使用,直接在MenuItem上使用collapseActionView()
【解决方案3】:

有一个简单的方法可以做到这一点:

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

或使用:

myToolBar.collapseActionView();

这将使 searchView 在您按下后退之前折叠,然后将调用后退操作。

两种解决方案都可以。

【讨论】:

  • collapseActionView 不行,第一个解决办法是的
【解决方案4】:

这是唯一对我有用的事情:

  toolbar.collapseActionView();

【讨论】:

  • 我尝试了这个线程中的所有解决方案。这个解决方案对我来说是最好的。这是使搜索图标回到右上角的唯一解决方案
  • IDE 给我“Actionbar.collapseActionView 只能从同一个库组中调用”错误
  • supportActionBar?.collapseActionView() 为我工作
【解决方案5】:

拦截返回按钮覆盖onBackPressed() (see 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();
    }
}

编辑

Docs say:

如有必要,您可以自己展开或折叠操作视图 代码通过调用 expandActionView() 和 collapseActionView() 菜单项。

【讨论】:

  • 感谢您的回复!不过,我主要感兴趣的是是否有办法以编程方式调用 SearchView 的关闭事件,即在代码中模仿 SearchView 框“X”按钮按下。
  • 感谢马尔辛的所有帮助。事实证明,我真正想做的是“图标化”我的搜索操作视图(我的搜索视图始终位于操作栏上,并且永远不会折叠到选项菜单中)。感谢您花时间帮助我,并感谢您提供有关覆盖“onBackPressed”的提示。
  • 对我来说 onBackPressed 没有被调用。我还有什么其他解决方案?我试图倾听对搜索视图的关注,但这也没有被调用..
  • 您不会期望onBackPressed() 在 Activity 之外(即在 Fragment 中),是吗?
  • 对我来说,onBackPressed 根本没有被调用。看起来搜索视图实际上正在吃掉后面的新闻并处理它。例如,我看到调用了 onMenuItemActionViewCollapsed(),但未调用 onBackPressed。我怎样才能覆盖这个?我什至尝试在搜索视图上设置一个 Key Listener,但它仍然不起作用。
【解决方案6】:

如果您在 searchView 上有输入

mSearchView.setIconified(true);

只会清除文本。

关闭 searchView 的正确方法是

mSearchView.onActionViewCollapsed();

【讨论】:

    【解决方案7】:

    用途:

    searchView.setIconified(true);
    

    【讨论】:

      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

        无需为此使用onBackPressed() 方法!! 我找到了解决方案,只需按照我下面提到的方法进行操作,以便 SearchView 本身处理 on back button press 事件。

        在您的 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"/>
        

        你准备好了;)

        附注- 找了好久,终于找到了,希望对大家有帮助。

        【讨论】:

          【解决方案10】:

          在 Kotlin 中;

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

          searchView.isIconified = true
          

          二、关闭搜索视图

          searchView.onActionViewCollapsed()
          

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

          searchView.onActionViewExpanded()
          

          【讨论】:

            【解决方案11】:

            我的方式:

            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
            1. 在 onCreateOptionsMenu 中创建 CustomSearchView
            CustomSearchView searchView = (CustomSearchView)menu.findItem(R.id.menu_search).getActionView();

            【讨论】:

              【解决方案12】:

              如果您没有使用 onBackPressed() 方法中的任何函数,请将其从您的 Activity 中删除。以便 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"/>
              

              【讨论】:

                【解决方案13】:

                您也可以使用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" />
                

                【讨论】:

                  【解决方案14】:

                  以下内容对我有用。当用户单击后退按钮时,我正在尝试从 Jetpack NavigationView 中的 Fragment 关闭搜索视图 -

                  requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), new OnBackPressedCallback(true) { @覆盖 公共无效句柄OnBackPressed() {

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

                  【讨论】:

                    【解决方案15】:

                    最有效的解决方案:

                    MenuItem menuItem = ....//
                    menuItem.collapseActionView();
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2020-11-22
                      • 2013-07-12
                      • 2011-07-15
                      • 2015-11-26
                      • 2020-07-08
                      • 2010-11-17
                      • 2016-03-08
                      相关资源
                      最近更新 更多