【问题标题】:How do I open the SearchView programmatically?如何以编程方式打开 SearchView?
【发布时间】:2013-01-09 12:54:44
【问题描述】:

有一个名为“SearchView”的ActionBar 小部件。 不使用时是这样的:

而且在使用的时候是这样的:

我想(当然以编程方式)打开搜索视图(使其“处于使用中”)。

我尝试了几个功能,例如:

SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    searchView.setOnQueryTextListener(this);

    searchView.performClick();
    searchView.requestFocus();

但这些都不起作用......

XML 中的 SearchView:

<item android:id="@+id/menu_search"
      android:title="Search"
      android:icon="@drawable/ic_action_search"
      android:showAsAction="ifRoom|collapseActionView"
      android:actionViewClass="android.widget.SearchView" />

【问题讨论】:

    标签: java android android-actionbar


    【解决方案1】:

    扩展SearchView
    searchView.setIconified(false);
    

    并用

    折叠它
    searchView.setIconified(true);
    

    您需要将android:showAsAction 的值从ifRoom|collapseActionView 更改为alwaysSearchView 的属性android:iconifiedByDefault 应该是true,这是默认值,否则用户无法将SearchView 以编程方式展开后折叠起来。

    【讨论】:

    • 您好,键盘弹出,但是 SearchView 没有打开。
    • 您好,这也不起作用。我用 XML 源代码更新了帖子。
    • 你是我的f*king英雄
    • showAsAction="always" 会在旋转后显示一个丑陋的全屏搜索栏
    • showAsAction="always" 使搜索图标在展开时停留在操作栏上,这与手动聚焦搜索时的外观不同。
    【解决方案2】:

    尝试在 MenuItem 上调用 expandActionView(),而不是在 ActionView 上调用 onActionViewExpanded()。

    它对我有用。

    MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
    searchView = (SearchView) searchMenuItem.getActionView();
    searchMenuItem.expandActionView();
    

    【讨论】:

    • 完美运行,但仅适用于 API > 14。对于早期的 API,您可以使用:MenuItemCompat.expandActionView(searchMenuItem);
    • 这是正确的解决方案 - 选择的解决方案会强制您设置 showAsAction: always,这会导致一些问题。
    【解决方案3】:

    如果您只想在必要时使用支持库,请执行此操作

        MenuItem searchMenuItem = menu.findItem(R.id.action_search);
        if (Utils.hasIceCreamSandwich())
            searchMenuItem.expandActionView();
        else MenuItemCompat.expandActionView(searchMenuItem);
    

    否则只需这样做

        MenuItem searchMenuItem = menu.findItem(R.id.action_search);
        MenuItemCompat.expandActionView(searchMenuItem);
    

    【讨论】:

      【解决方案4】:

      我知道这已经晚了,但是

      尝试调用 expandActionView() 来打开它并调用 collapseActionView() 来关闭它。您可以通过 getActionView() 在实际的 Action View 上调用 requestFocus() 以赋予搜索视图焦点:)

      【讨论】:

        【解决方案5】:

        对于androidx.appcompat.widget.SearchView

        searchView.setIconifiedByDefault(true)   // didn't work
        
        searchMenuItem.expandActionView()  // didn't work
        
        MenuItemCompat.expandActionView(searchMenuItem) // didn't work
        
        searchView.onActionViewExpanded()  // didn't work
        

        以下对我有用,

        searchView.findViewById<View>(R.id.search_button).performClick()
        

        【讨论】:

        • 您应该使用searchView.setIconified(false) 来展开搜索视图
        【解决方案6】:

        扩展 Matthias Robberts 的答案:

        我想要一个列表片段来保留它的搜索值并在用户从其他片段返回后设置它。

        if (myViewModel.filterTextSaved.isNotEmpty()) { // Kotlin, storing state in ViewModel
            searchItem.expandActionView() // needs to come first, otherwise empty text
            theTextArea.setText(courseViewModel.filterTextOnClick)
        }
        

        对于菜单我保留always|collapseActionView,否则当用户删除文本时它保持打开状态。

        【讨论】:

          【解决方案7】:

          要打开searchView,最后保留close_button,请在onCreate中使用:-

          searchView.findViewById(R.id.search_button).performClick();
          

          【讨论】:

            【解决方案8】:

            我正在寻找以编程方式扩展 SearchView 的解决方案 因为我需要恢复展开状态。没有一种解决方案对我有用。 除了使用 Handler().post()。我知道使用 post() 不是一个好习惯。 但我正在处理遗留项目,这种解决方法对我来说是可以接受的。

            初始化变量块

            val searchMenuItem = menu.findItem(R.id.menu_search_item)
            val searchView = searchMenuItem.actionView as SearchView
            

            如何展开 SearchView:

            Handler().post {
               searchMenuItem.expandActionView()
            }
            

            post() 有帮助的原因: 如果你的应用程序写得不好,它可能会在 UI 线程上做太多的工作。 post() 确保您的代码块将在 UI 线程可用于执行时执行。这意味着如果您使用此解决方法,您会注意到 SearchView 展开之间的小延迟

            【讨论】:

              猜你喜欢
              • 2013-07-04
              • 2016-06-04
              • 1970-01-01
              • 2013-07-12
              • 2014-06-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多