Dal momento che l'app è compatibile, la mia searchview non funziona più:
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)
Quindi nullpointer per searchview mentre lo ho:
@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);
}
E nel mio menu ho questo:
<!-- 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"/>
Non ho idea del motivo per cui non funziona più ma è successo da quando ho iniziato a usare app compat 21.
Saluti,
Prova a utilizzare lo spazio dei nomi app
personalizzato anche per actionViewClass
:
app:actionViewClass="Android.support.v7.widget.SearchView"/>
Aggiungi la seguente riga aproguard-rules.profile situato all'interno diappcartella:
-keep classe Android.support.v7.widget.SearchView {*; }
Questo potrebbe anche accadere se hai proguard abilitato e sta eliminando la classe SearchView
. Dovresti modificare le impostazioni di proguard per mantenere la classe.
Vedi this question per maggiori dettagli.
È un'informazione aggiuntiva alla risposta di Simas. Ho trovato questo in un'altra risposta ( https://stackoverflow.com/a/33400808/4949671 ) ed è stato molto importante per risolvere la mia eccezione:
Si noti che,
app:actionViewClass
NOTAndroid:actionViewClass
dopo un po 'di tempo con "run & error" ho trovato una soluzione. Sembra che l'elemento UI non sia la ragione per cui ciò causa l'errore. Dopo aver impostato la ricerca su QueryListener, funziona bene. Ecco un codice:
Attività che contiene la barra di ricerca:
@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"/>
E il "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"/>
...
E ultimo, ma non meno importante, il manifest (ma questo dovrebbe essere chiaro) ...
<activity
Android:name=".activities.MainActivity"
Android:label="@string/title_activity_main">
<meta-data
Android:name="Android.app.searchable"
Android:resource="@xml/searchable"/>
</activity>
maggiori informazioni -> Documenti
Se usi progurd allora devi aggiungere la seguente riga in proguard-rules.pro file
-keep public class Android.support.v7.widget. ** {*; }
o
-keep classe Android.support.v7.widget.SearchView {*; }
Se se si minimizzano i tipi di build in quel modo, è necessario aggiungere una singola riga al file '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'
}
}
Aggiungi riga il tuo file 'proguard-rules.pro'.
-keep class Android.support.v7.widget.SearchView { *; }
Il problema si verifica se Proguard è abilitato . Può essere risolto aggiungendo questo alle regole proguard
-keep classe Android.support.v7.widget.SearchView {*; }
Dopo aver fatto clic su un risultato, la tua app si aspetta che un'operazione non sia stata completata e sta tentando di andare oltre in un argomento Intent.
SearchView.OnSuggestionListener
e restituisce true
che notifica all'app che l'operazione di clic è stata completata.
searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
@Override
public boolean onSuggestionClick(int position) {
return true;
}
@Override
public boolean onSuggestionSelect(int position) {
return false;
}
});