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,
Essayez également d’utiliser l’espace de noms app
personnalisé pour votre actionViewClass
:
app:actionViewClass="Android.support.v7.widget.SearchView"/>
Ajoutez la ligne suivante àproguard-rules.profichier situé dans le dossierapp:
-keep class Android.support.v7.widget.SearchView {*; }
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.
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:actionViewClass
ET NONAndroid:actionViewClass
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
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 {*; }
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 { *; }
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 {*; }
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;
}
});