2012-12-22 20 views
8

我按照Android API Guide中的说明设置SearchWidget。它在操作栏中正确显示放大镜图标,如果我点击它,它将在操作栏(具有深色背景的输入字段)中启动搜索小部件。如果用户按下设备的搜索按钮,则在ActionBar中显示SearchWidget

但是,如果我按虚拟设备的搜索按钮,然后不同的搜索领域推出:它有一个白色的背景和不调用我指定的回调方法。

所以我将此添加到我的MainActivity类别:

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

搜索小工具的建立是完全一样的,因为它是在文档中描述:

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的原因()方法是,Android的API在引导它在“切换搜索框能见度的能力”说:

“默认情况下,搜索小工具是“图标化的”,这意味着它仅由代表搜索图标(放大镜)代表的 ,并且当用户触摸它时扩展到 显示搜索框。如上图所示,默认情况下,您可以通过调用 setIconifiedByDefault(false), 显示搜索框。您也可以通过调用切换搜索小工具 外观setIconified()“

我也试着拨打startSearch("", false, null, false);但是这带来了同样的搜索领域与白色背景

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

回答

10

在写这个问题时,我想出了解决方案我仍然决定将它与答案一起发布,因为它看起来不像像这个问题之前已经被问过,也许有人遇到同样的问题和/或提出更好的解决方案。

所有你需要做的是在搜索菜单项调用expandActionView(),和一切工作像预期:

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