如何以编程方式打开SearchView?

时间:2013-01-09 12:54:44

标签: java android android-actionbar

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

enter image description here

当它正在使用时,它看起来像这样:

enter image description here

我想(通过编程方式)打开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" />

8 个答案:

答案 0 :(得分:231)

使用

展开SearchView
searchView.setIconified(false);

并用

折叠它
searchView.setIconified(true);

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

答案 1 :(得分:67)

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

它对我有用。

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

答案 2 :(得分:12)

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

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

其他只是这样做

<iframe>

答案 3 :(得分:6)

我知道这已经晚了但是

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

扩展Matthias Robberts的答案:

我希望列表片段保留其搜索值,并在用户从其他片段返回后进行设置。

awslogs get /aws/lambda/log-group-1  --filter-pattern '"ClinicID=7667"' --filter-pattern '" username=simran+test@abc.com"' --start "5h ago" --timestamp

,对于菜单,我保留if (myViewModel.filterTextSaved.isNotEmpty()) { // Kotlin, storing state in ViewModel searchItem.expandActionView() // needs to come first, otherwise empty text theTextArea.setText(courseViewModel.filterTextOnClick) } ,否则当用户删除文本时它将保持打开状态。

答案 6 :(得分: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展开之间的延迟很小

答案 7 :(得分:0)

对于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()