13

我正在尝试在 API 8 应用程序中使用SearchViewCompatwith 。ActionBarSherlock

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(). 这是否意味着无法进行搜索?

4

4 回答 4

6

如果您使用的是 ActionBarSherlock 库 4.2 版,您可以将 API 11 SearchView 小部件替换为 ActionBarSherlock SearchView 小部件,以使其向后兼容:

搜索.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()));
            }
        }
    }
}
于 2013-03-18T13:19:59.690 回答
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;
}

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

于 2014-02-23T17:52:45.990 回答
2

实际问题是什么?由于该小部件不存在,因此将为HC 之前的设备SearchViewCompat返回。这意味着您必须提供您自己的模仿 HC SearchView 的自定义操作视图。nullSearchView

您还可以SearchView从 Android 源中反向移植组件并使用它。

否则,您可以只使用 Android 现有的搜索界面,在这种情况下,对于 HC+ 设备,您使用操作视图执行搜索,但在 Froyo 和 Gingerbread 设备上,用户单击搜索图标,搜索栏会从顶部显示动画。

希望这可以帮助。

于 2012-09-10T05:33:55.710 回答
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);
于 2015-09-26T10:04:33.523 回答