android - SearchView getActionView devolviendo nulo
android-searchmanager android-support-library (8)
Hoy me di cuenta de que estaba obteniendo nulo de la llamada a getActionView () en elementos que no tenían:
android:showAsAction="always"
Parece que de lo contrario no se inflan correctamente.
Esto estaba funcionando hace unos días, pero de repente se detuvo. Solo quiero usar el widget de búsqueda de barra de acciones cuando cierto fragmento está visible.
Ahora no puedo obtener SearchView
, ahora getActionView
siempre devuelve null.
searchable.xml
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="@string/search_for_places">
</searchable>
Manifest.xml
<activity
android:name=".ui.activities.MainActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.SEARCH"/>
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable"/>
<meta-data
android:name="android.app.default_searchable"
android:value=".ui.activities.MainActivity" />
</activity>
menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:myapp="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_search_place"
android:icon="@drawable/ic_2_action_search"
android:orderInCategory="1"
android:title="@string/title_search"
myapp:showAsAction="collapseActionView|ifRoom"
myapp:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>
El fragmento
...
setHasOptionsMenu(true);
...
@Override
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
inflater.inflate(R.menu.menu, menu);
MenuItem searchItem = menu.findItem(R.id.action_search_place);
mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);
SearchManager searchManager = (SearchManager) getBaseActivity().getSystemService(Context.SEARCH_SERVICE);
if (mSearchView != null) {
mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
mSearchView.setIconifiedByDefault(true);
mSearchView.setOnQueryTextListener(this);
}
super.onCreateOptionsMenu(menu, inflater);
}
Hoy tuve el mismo problema y creo que lo resolví. Resultó que hice un par de cosas que no eran exactamente según el contrato de ActionBarCompat
:
- Cada actividad que usa
ActionBarCompat
debe extenderActionBarActivity
lugar deFragmentActivity
directamente - Cada actividad que usa
ActionBarCompat
debe declarar que su tema hereda de los temas deActionBarCompat
.
Los dos que encontré viendo el video explicativo de Google.
Ahora mi searchView
ya no es null
.
Lo arreglé: en el menú xml, utilicé el espacio de nombres de la aplicación:
app:showAsAction="collapseActionView|always"
app:actionViewClass="android.support.v7.widget.SearchView"
El tutorial de Android, https://developer.android.com/training/search/setup.html , usa android: showAs y android: actionView ...
Para mí, la siguiente solución funcionó:
<?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"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.dev.ttburger.conttagem.BuscarProdutoActivity">
<item
android:id="@+id/search"
android:icon="@drawable/ic_search"
android:title="Buscar"
app:showAsAction="always"
app:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>
Cambiar a:
<?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"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.dev.ttburger.conttagem.BuscarProdutoActivity">
<item
android:id="@+id/search"
android:icon="@drawable/ic_search"
android:title="Buscar"
app:showAsAction="always"
app:actionViewClass="android.SearchView"/>
</menu>
Si usa Proguard, esta es la respuesta posible: https://code.google.com/p/android/issues/detail?id=58508
En resumen, agregue la línea siguiente a su archivo de configuración de proguard-rules.pro
.
-keep class android.support.v7.widget.SearchView { *; }
Tuve el mismo problema porque en mi menú utilicé: android:actionViewClass="android.widget.SearchView"
según la documentación de google.
Bueno, resulta que si estoy usando AppCompatActivity, debería usar la app:actionViewClass="android.widget.SearchView"
lugar.
Espero que esto ayude a alguien.
Yo estaba con el mismo error. Y he hecho las siguientes cosas:
Tengo una actividad que se extiende por FragmentActivity:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.feed, menu);
// 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 true;
}
Searchable.xml:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_label"
android:hint="@string/search_hint" >
</searchable>
Menu.xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="br.com.srtorcedor.FeedActivity">
<item android:id="@+id/action_search"
android:icon="@drawable/abc_ic_search"
android:title="@string/search_title"
android:showAsAction="always"
android:actionViewClass="android.widget.SearchView"/>
</menu>
AndroidManifest:
<activity
android:name=".FeedActivity"
android:icon="@drawable/ic_action_pins"
android:label="@string/title_activity_feed">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
¿Podría verificar si funciona con usted?