2012-04-19 61 views
13

我想在API 8应用程序中使用SearchViewCompatActionBarSherlockandroid.support.v4.widget.SearchViewCompat示例?

public boolean onCreateOptionsMenu(Menu menu) { 
    MenuItem item = menu.add("Search") 
     .setIcon(isLight ? R.drawable.ic_search_inverse : R.drawable.ic_search) 
     .setActionView(R.layout.collapsible_edittext); 
    item.setShowAsAction(
     MenuItem.SHOW_AS_ACTION_ALWAYS | 
     MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 

    // To use SearchViewCompat, I need to add it to the Menu item as well: 
    View searchView = SearchViewCompat.newSearchView(this); 
    // ... 
    SearchViewCompat.setOnQueryTextListener(...); 
    // ... 
    item.setActionView(searchView); 

请注意,顶部和底部的代码需要调用setActionView()。这是否意味着无法进行搜索?

+1

不要问代码,您可以添加,到目前为止,你的问题,你已经得到了代码。也许人们可以帮助你解决你的问题。 – THelper 2012-04-19 07:47:52

+1

谢谢THelper。还看起来像我的本地文件已过时,我找到了一个特定的开发人员主题:http://developer.android.com/training/search/backward-compat.html – woodglue 2012-04-20 05:22:13

回答

2

实际问题是什么?由于SearchView小部件不存在,所以SearchViewCompat将返回用于预HC设备的null。这意味着您将不得不提供您自己的模仿HC SearchView的自定义操作视图。

您也可以将Android源代码中的SearchView组件返回并使用它。

否则,您可以使用Android已有的搜索界面,在这种情况下,您使用操作视图执行搜索的HC +设备执行搜索,但在Froyo和Gingerbread设备上,用户单击搜索图标和搜索栏动画从一开始。

希望这会有所帮助。

+0

你可以指向一个实现,如果有的话? – 2012-12-04 22:08:48

6

如果您使用的是ActionBarSherlock库版本4.2,可以更换API 11搜索查看的Widget与ActionBarSherlock搜索查看窗口小部件,使其向后兼容:

search.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/menu_search" 
     android:icon="@drawable/ic_action_search" 
     android:title="@string/description_search" 
     android:orderInCategory="0" 
     android:actionViewClass="com.actionbarsherlock.widget.SearchView" 
     android:showAsAction="ifRoom|collapseActionView" /> 
</menu> 

活动分类

//IMPORTANT!!! 
import com.actionbarsherlock.widget.SearchView; 

.. 。

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    getSupportMenuInflater().inflate(R.menu.search, menu); 
    setupSearchMenuItem(menu); 
    return true; 
} 

private void setupSearchMenuItem(Menu menu) { 
    MenuItem searchItem = menu.findItem(R.id.menu_search); 
    if (searchItem != null) { 
     SearchView searchView = (SearchView) searchItem.getActionView(); 
     if (searchView != null) { 
      SearchManager searchManager = 
       (SearchManager) getSystemService(SEARCH_SERVICE); 
      searchView.setSearchableInfo(
       searchManager.getSearchableInfo(getComponentName())); 
      } 
     } 
    } 
} 
2

在您的活动的一些点:

public class HomeActivity extends SherlockFragmentActivity implements 
    SearchView.OnQueryTextListener { 

// ...  
SearchView searchView = (com.actionbarsherlock.widget.SearchView) 
    actionBarCustom.findViewById(R.id.search); 
SearchManager sm = (SearchManager)getSystemService(SEARCH_SERVICE); 
searchView.setSearchableInfo(sm.getSearchableInfo(getComponentName())); 
searchView.setSubmitButtonEnabled(true); 
searchView.setOnQueryTextListener(this); 

,然后筛选列表适配器:

@Override 
public boolean onQueryTextSubmit(String query) { 
    return true; 
} 

@Override 
public boolean onQueryTextChange(String newText) { 
    mAdapter.getFilter().filter(newText.trim()); 
    return false; 
} 

这样,你的列表适配器必须实现过滤。

0

最好使用MenuItemCompat,我认为这是有帮助的,你

getMenuInflater().inflate(R.menu.main, menu); 
    MenuItem searchItem = menu.findItem(R.id.search); 
    SearchManager searchManager =(SearchManager)getSystemService(Context.SEARCH_SERVICE); 
    SearchView searchView = (SearchView)MenuItemCompat.getActionView(searchItem); 
    SearchableInfo info = searchManager.getSearchableInfo(getComponentName()); 
    searchView.setSearchableInfo(info); 
相关问题