Material SearchView实现错误

时间:2017-06-16 19:38:00

标签: android material-design

我正在开发一个Android应用程序,现在一切都很棒,但是当我尝试使用Google指南实现Material SearchView并逐步完成一些教程时,我无法弄清楚这个错误:

menu_main.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/search_ad"
        android:enabled="true"
        android:icon="@android:drawable/ic_menu_search"
        android:title="Buscar"
        android:visible="true"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="ifRoom|collapseActionView" />

    <item
        android:id="@+id/publish_ad"
        android:enabled="true"
        android:icon="@android:drawable/ic_menu_send"
        android:title="Publicar anuncio"
        android:visible="true"
        app:showAsAction="never" />

    <item
        android:id="@+id/favs"
        android:enabled="true"
        android:title="Configuración"
        android:visible="true"
        app:showAsAction="never" />
</menu>

MainActivity

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_main, menu);

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

    return true;
}

错误:

06-16 15:36:51.021 1239-1239/com.bachecubano.elbache E/AndroidRuntime: FATAL EXCEPTION: main
   Process: com.bachecubano.elbache, PID: 1239
   java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.setSearchableInfo(android.app.SearchableInfo)' on a null object reference
       at com.bachecubano.elbache.MainActivity.onCreateOptionsMenu(Unknown Source)
       at android.app.Activity.onCreatePanelMenu(Activity.java:2889)
       at android.support.v4.b.m.onCreatePanelMenu(Unknown Source)
       at android.support.v7.view.i.onCreatePanelMenu(Unknown Source)
       at android.support.v7.app.h$b.onCreatePanelMenu(Unknown Source)
       at android.support.v7.view.i.onCreatePanelMenu(Unknown Source)
       at android.support.v7.app.q.j(Unknown Source)
       at android.support.v7.app.q$1.run(Unknown Source)
       at android.os.Handler.handleCallback(Handler.java:815)
       at android.os.Handler.dispatchMessage(Handler.java:104)
       at android.os.Looper.loop(Looper.java:207)
       at android.app.ActivityThread.main(ActivityThread.java:5692)
       at java.lang.reflect.Method.invoke(Native Method)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)

5 个答案:

答案 0 :(得分:3)

您是否在清单上添加了以下代码:

<activity
    android:name=".ActivityWhereYouWantYourSearch">
    ...
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>

    <meta-data android:name="android.app.searchable"
        android:resource="@xml/searchable"/>
</activity>

这是在 res / xml 文件夹(名为 searchable.xml )上:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:hint="@string/search_hint"
    android:label="@string/app_name"
    android:searchSettingsDescription="@string/search_description" />

我还会检查您的onCreateOptionsMenu,如下所示:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_main, menu);

    MenuItem searchItem = menu.findItem(R.id.search_ad);
    if (searchItem != null) {
        SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) searchItem.getActionView();
        // Assumes current activity is the searchable activity
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default
    }
    return true;
}

顺便说一句,我没有使用android:enabledandroid:visible,但您可以自行决定。

答案 1 :(得分:2)

我不熟悉这种SearchView,但从错误中我猜它无法获取Activity的ComponentName。我现在要尝试的是在getComponentName() - &gt;之前放一个这个。 this.getComponentName()以确保它应该在何处获取ComponentName。

只是一个猜测,所以如果那是错的,请不要恨我^^

答案 2 :(得分:2)

为了实现通货膨胀,您必须从onCreateOptionsMenu返回true。因此,在返回语句之前尝试访问NPE时会得到menu

因此,将这四行代码删除到适当的方法onPrepareOptionsMenu

答案 3 :(得分:2)

我猜您的代码的问题在于您使用的是最新版本的支持库,但使用旧样式访问“SearchView”,这就是它返回null的原因。使用以下代码行通过“MenuItemCompat”访问您的搜索视图:

 SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search));

查看此博客了解更多详情:

https://chris.banes.me/2014/10/17/appcompat-v21/

答案 4 :(得分:2)

而不是

return true;

添加此行

return super.onCreateOptionsMenu(menu);