Searchview doesn't work since app compat

JavaAndroidSearchMenuAndroid Appcompat

Java Problem Overview


Since I implented app compat my searchview doesn't work anymore:

 Process: com.laurenswuyts.witpa, PID: 26666
    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.laurenswuyts.witpa.Activities.Events.EventActivity.onCreateOptionsMenu(EventActivity.java:75)
            at android.app.Activity.onCreatePanelMenu(Activity.java:2820)
            at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:275)
            at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:276)
            at android.support.v7.app.ActionBarActivityDelegate$1.onCreatePanelMenu(ActionBarActivityDelegate.java:79)
            at android.support.v7.widget.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:49)
            at android.support.v7.internal.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:459)
            at android.support.v7.internal.app.ToolbarActionBar$1.run(ToolbarActionBar.java:69)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

So nullpointer for searchview while I have it:

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

        // Get the SearchView and set the searchable configuration
        // Associate searchable configuration with the SearchView
        SearchManager searchManager =
                (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView =
                (SearchView) menu.findItem(R.id.action_search).getActionView();
        searchView.setSearchableInfo(
                searchManager.getSearchableInfo(getComponentName()));


        return super.onCreateOptionsMenu(menu);
    }

And in my menu I have this:

<!-- Search Widget -->
  <item android:id="@+id/action_search"
      android:title="@string/action_search"
      android:icon="@drawable/ic_action_search"
      app:showAsAction="always"
      android:actionViewClass="android.support.v7.widget.SearchView"/>

I have no idea why it doesn't work anymore but it happened since I started using app compat 21.

Regards,

Java Solutions


Solution 1 - Java

Try using the custom app namespace for your actionViewClass too:

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

Solution 2 - Java

Add the following line to proguard-rules.pro file located inside app folder:

> -keep class android.support.v7.widget.SearchView { *; }

Solution 3 - Java

This could also happen if you have proguard enabled and it is striping aways SearchView class. You would need to modify proguard settings to keep the class.

See this question for more details.

Solution 4 - Java

It´s an additional information to Simas answer. I found this in another answer (https://stackoverflow.com/a/33400808/4949671) and it was very important for solving my exception:

> Notice that, it is, app:actionViewClass NOT > android:actionViewClass

Solution 5 - Java

after a while of playing "run & error" I found a solution.. Looks like the UI-element isn't the reason what causes the error. After setting the search to the QueryListener it is working well. Here is some code:

Activity which contains the SearchBar:

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

        SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String s) {
                Log.d(TAG, "onQueryTextSubmit ");
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                Log.d(TAG, "onQueryTextChange ");
                return false;
            }
        });

        return true;
    }

searchable.xml

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
                                      android:label="@string/app_name"
                                      android:hint="@string/search_hint"/>

And the "SearchBar" in menu.xml

     <item
            android:id="@+id/search"
            android:title="@string/search_title"
            android:icon="@drawable/abc_ic_search_api_mtrl_alpha"
            app:showAsAction="collapseActionView|ifRoom"
            app:actionViewClass="android.support.v7.widget.SearchView"/>

...

And last, but not least, the manifest (but this should be clear)...

  <activity
        android:name=".activities.MainActivity"
        android:label="@string/title_activity_main">
        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable"/>
    </activity>

more information -> Docs

Solution 6 - Java

If you use progurd then you have to add the following line into proguard-rules.pro file

> -keep public class android.support.v7.widget.** { *; }

or

> -keep class android.support.v7.widget.SearchView { *; }

Solution 7 - Java

If if you minify in your build types like that then you need to add a single line your 'proguard-rules.pro' file.

buildTypes {
    release {
        debuggable false
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        debuggable true
        minifyEnabled false
        shrinkResources false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

Add line your 'proguard-rules.pro' file.

> -keep class android.support.v7.widget.SearchView { *; }

Solution 8 - Java

After you've clicked on a result, your app is expecting that an operation has not completed and is trying to go further into an Intent argument.

SearchView.OnSuggestionListener and return true which notifies your app that the click operation has completed.

        searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {

            @Override
            public boolean onSuggestionClick(int position) {
                return true;
            }

            @Override
            public boolean onSuggestionSelect(int position) {
                return false;
            }
        });

Solution 9 - Java

Issue occurs if Proguard is enabled. can be fixed by adding this to proguard rules

-keep class android.support.v7.widget.SearchView { *; }

Solution 10 - Java

I had pretty similar issue with androidx.appcompat.widget.SearchView, but different cause. The crash occurs on an action button click

 Process: hotspotshield.android.vpn, PID: 26089
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.drawable.Drawable.getPadding(android.graphics.Rect)' on a null object reference
    at androidx.appcompat.widget.SearchView.adjustDropDownSizeAndPosition(SearchView.java:1373)
    at androidx.appcompat.widget.SearchView$4.onLayoutChange(SearchView.java:380)
    at android.view.View.layout(View.java:20690)
    at android.view.ViewGroup.layout(ViewGroup.java:6194)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)

The cause is missing attribute android:popupBackground in the theme. Actually material AppCompat themes has the required background, but despite my theme extends from Theme.AppCompat.Light, it still crashes. The only solution i have found is to override the attribute:

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="android:popupBackground" tools:ignore="PrivateResource">@drawable/abc_popup_background_mtrl_mult</item>
</style>

It is the default drawable which is used in AppCompat. It is marked as private, but you may use it though. Or declare background drawable by yourself

Solution 11 - Java

in my case, this issue occur after migrate my project to AndroidX. so replace this: android.support.v7.widget.SearchView by this: androidx.appcompat.widget.SearchView

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionLaurenswuytsView Question on Stackoverflow
Solution 1 - JavaSimasView Answer on Stackoverflow
Solution 2 - JavaDarushView Answer on Stackoverflow
Solution 3 - JavaParag SardaView Answer on Stackoverflow
Solution 4 - JavaFlorian SchneiderView Answer on Stackoverflow
Solution 5 - JavaMartin PfefferView Answer on Stackoverflow
Solution 6 - JavaMasumView Answer on Stackoverflow
Solution 7 - JavaAtiar TalukdarView Answer on Stackoverflow
Solution 8 - JavaKasun WanniarachchiView Answer on Stackoverflow
Solution 9 - Javajeevraj jangidView Answer on Stackoverflow
Solution 10 - JavaBelooView Answer on Stackoverflow
Solution 11 - Javahamil.DevView Answer on Stackoverflow