如果用户按下设备的searchbutton,则在ActionBar中显示SearchWidget

我按照Android API指南中的描述设置了一个SearchWidget。 它在操作栏中正确显示一个放大镜图标,如果点击它,它会在操作栏(具有深色背景的input字段)内启动search小部件。

但是,如果我按下虚拟设备的searchbutton,则会启动另一个search字段:它具有白色背景,不会调用我指定的callback方法。

所以我把这个添加到我的MainActivity类中:

public boolean onSearchRequested() { SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); searchView.setIconified(!searchView.isIconified()); return false; } 

search小部件的设置与文档中描述的完全相同:

 SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(false); searchView.setOnQueryTextListener(new CustomSearchQueryTextListener()); 

我的searchable.xml:

 <?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name"> </searchable> 

和AndroidManifest.xml:

  <activity android:name="MainActivity" android:label="@string/app_name" android:launchMode="singleTask" android:uiOptions="splitActionBarWhenNarrow" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> </activity> 

之所以我尝试setIconfied()方法,是因为它在“切换search框可见性的能力”的“Android API指南”中说过:

“默认情况下,search窗口小部件是”图标化的“,意味着它仅由一个search图标(放大镜)表示,并展开以显示search框,当用户触摸时,如上所示,您可以显示search通过调用setIconifiedByDefault(false),您可以通过调用setIconified()来切换search窗口小部件外观。

我也尝试调用startSearch("", false, null, false); 但是这带来了与白色背景相同的search字段。

所以我的问题是:如果用户按下设备的searchbutton,是否可以在操作栏中启动search小部件,即执行与search菜单项单击完全相同的操作?

在写这个问题的时候,我自己想出了这个解决scheme。 我仍然决定把它和答案一起发布,因为这个问题似乎没有被问到过,也许有人遇到同样的问题和/或提出更好的解决scheme。

所有你需要做的就是在search菜单项上调用expandActionView() ,并且所有事情都像预期的那样工作:

 public boolean onSearchRequested() { menu.findItem(R.id.menu_search).expandActionView(); return true; }