110

ActionBar 有一个名为“SearchView”的小部件。不使用时,它看起来像这样:

在此处输入图像描述

而在使用时,它看起来是这样的:

在此处输入图像描述

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

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

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" />
4

8 回答 8

273

展开SearchView_

searchView.setIconified(false);

并用

searchView.setIconified(true);

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

于 2013-01-09T13:12:47.707 回答
76

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

这个对我有用。

MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
searchView = (SearchView) searchMenuItem.getActionView();
searchMenuItem.expandActionView();
于 2013-09-21T13:03:42.067 回答
13

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

    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);
于 2015-06-17T22:05:29.097 回答
6

我知道这已经晚了,但是

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

于 2013-03-10T22:26:32.797 回答
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()
于 2020-10-29T10:15:55.447 回答
2

扩展 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,否则当用户删除文本时它会保持打开状态。

于 2019-12-08T22:49:16.597 回答
0

要打开一个searchView保持close_button最终使用它onCreate: -

searchView.findViewById(R.id.search_button).performClick();
于 2019-11-16T18:55:07.497 回答
0

我正在寻找一种以编程方式展开 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 扩展之间的小延迟

于 2020-09-25T12:51:51.970 回答