web-dev-qa-db-fra.com

Searchview ne fonctionne pas puisque l'application est compatible

Depuis que j'ai implémenté une application, mon searchview ne fonctionne plus:

 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)

Donc nullpointer pour searchview tant que je l’ai:

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

Et dans mon menu, j'ai ceci:

<!-- 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"/>

Je ne sais pas pourquoi cela ne fonctionne plus, mais c'est arrivé depuis que j'ai commencé à utiliser l'app compat 21.

Cordialement,

62
Laurenswuyts

Essayez également d’utiliser l’espace de noms app personnalisé pour votre actionViewClass:

app:actionViewClass="Android.support.v7.widget.SearchView"/>
228
Simas

Ajoutez la ligne suivante àproguard-rules.profichier situé dans le dossierapp:

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

39
Darush

Cela peut également se produire si proguard est activé et que le striping est toujours dans la classe SearchView. Vous devez modifier les paramètres de proguard pour conserver la classe.

Voir this question pour plus de détails.

15
Parag Sarda

C'est une information supplémentaire à la réponse Simas. J'ai trouvé cela dans une autre réponse ( https://stackoverflow.com/a/33400808/4949671 ) et c'était très important pour résoudre mon exception:

Notez que c'est app:actionViewClassET NONAndroid:actionViewClass

10
Florian Schneider

après un certain temps de "run & error", j'ai trouvé une solution .. On dirait que l'élément d'interface utilisateur n'est pas la raison pour laquelle l'erreur est causée. Après avoir défini la recherche sur le QueryListener, cela fonctionne bien. Voici du code:

Activity qui contient le 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"/>

Et le "SearchBar" dans 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"/>

...

Et enfin, le manifest (mais cela devrait être clair) ... 

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

plus d'informations -> Docs

10
Martin Pfeffer

Si vous utilisez progurd , vous devez ajouter la ligne suivante dans proguard-rules.pro file

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

ou

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

4
Masum

Si vous réduisez de telle sorte vos types de construction, vous devez ajouter une seule ligne au fichier 'proguard-rules.pro'. 

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

Ajoutez en ligne votre fichier 'proguard-rules.pro'. 

-keep class Android.support.v7.widget.SearchView { *; }
1
Atiar Talukdar

Un problème survient si Proguard est activé . Peut être corrigé en ajoutant ceci aux règles de proguard

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

0
jeevraj jangid

Une fois que vous avez cliqué sur un résultat, votre application s'attend à ce qu'une opération ne soit pas terminée et tente d'aller plus loin dans un argument d'intention.

SearchView.OnSuggestionListener et return true qui informe votre application que l'opération de clic est terminée.

        searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {

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

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