android.support.v4.widget.SearchViewCompat示例?

13

我正在尝试在一个API 8应用程序中使用ActionBarSherlockSearchViewCompat

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
1
谢谢THelper。看起来我的本地文档已经过时了,我找到了一个特定的开发者主题:http://developer.android.com/training/search/backward-compat.html - woodglue
4个回答

6
如果您正在使用ActionBarSherlock 4.2版本库,您可以使用ActionBarSherlock SearchView小部件替换API 11 SearchView小部件,使其向后兼容:
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>

Activity class

//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
实际问题是什么?对于版本低于Honeycomb的设备,SearchViewCompat将返回null,因为该设备上没有SearchView小部件。这意味着您必须提供自己的自定义操作视图来模仿HC SearchView。
您还可以从Android源代码中回溯SearchView组件并使用它。
否则,您可以直接使用Android现有的搜索界面。在HC+设备上,您可以使用操作视图执行搜索,但在Froyo和Gingerbread设备上,用户会单击搜索图标并从顶部动画出一个搜索栏。
希望这有所帮助。

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接