SearchView content search error

I am developing an Android app, everything is fine now, but when you try to implement Material SearchView with google guidelines and follow the step by step guide, I cannot figure out this error:

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

      

Mistake:

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)

      

+3


source to share


5 answers


You added the following code to your manifest:

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

      

And this is in your res / xml folder (named 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" />

      



I'll also put a check on yours onCreateOptionsMenu

, for example:

@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;
}

      

By the way, I don't use android:enabled

and android:visible

, but it's up to you to decide.

+2


source


I am not familiar with this kind of SearchView, but from the error, I would guess that it cannot get the ComponentName for the Activity. What I would like to try is to put this before getComponentName () -> this.getComponentName () to see where it should get the computername.



Just guess so please don't hate me if it's wrong ^^

+2


source


You must return true from onCreateOptionsMenu

for inflation to take place. So when you try to access menu

before the return statement, you get NPE

.

So remove these four lines of code to the corresponding onPrepareOptionsMenu method

+2


source


I think the problem with your code is that you are using the latest support library, but using the old style to access the "SearchView", so it returns null. Use this line of code to access your search query via "MenuItemCompat":

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

      

Check out this blog for more details:

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

+2


source


Instead

return true;

      

add this line

return super.onCreateOptionsMenu(menu);

      

+2


source







All Articles