在扩展AppCompatActivity后,在我的搜索栏上出错

时间:2015-11-02 17:01:20

标签: android android-appcompat searchview

在扩展AppCompatActivity而不是Activity之后,我的项目出现以下错误:

  

java.lang.NullPointerException:尝试调用虚方法   '空隙   android.widget.SearchView.setSearchableInfo(android.app.SearchableInfo)'   在空对象引用上

我跟着这个链接[这] [1],但它对我不起作用。

请给我一些关于我做错的建议。

这是我的搜索代码:

 SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
            SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
            searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

这是菜单xml

  <item
    android:id="@+id/search"
    android:app:actionViewClass="android.widget.SearchView"
    android:icon="@drawable/ic_search"
    android:app:showAsAction="collapseActionView|always"
    android:title="@string/Search"/>

2 个答案:

答案 0 :(得分:1)

尝试使用 actionViewClass 的自定义应用名称空间:

app:actionViewClass="android.support.v7.widget.SearchView"/>

答案 1 :(得分:1)

您必须更改searchview的actionview类以支持和更改菜单中的架构。像这样

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<item android:id="@+id/search"
    android:title="Search"
    android:titleCondensed="false"
    android:icon="@drawable/abc_ic_search_api_mtrl_alpha"
    android:orderInCategory="0"
    app:showAsAction="ifRoom|collapseActionView"
    app:actionViewClass="android.support.v7.widget.SearchView" />
</menu>

然后在代码中你必须得到searchview并像这样使用expand listent。请记住使用支持库的SearchView。

    mSearchView = (SearchView) MenuItemCompat.getActionView(mSearchItem);
    mSearchView.setQueryHint(mContext.getString(R.string.search_messages));
    mSearchView.setIconifiedByDefault(true);
    mSearchView.setOnQueryTextListener(this);
    MenuItemCompat.setOnActionExpandListener(mSearchItem, new      MenuItemCompat.OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {

            return true;
        }

        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {

            }
            return true;
        }
    });