android android-searchmanager android-support-library

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 extender ActionBarActivity lugar de FragmentActivity directamente
  • Cada actividad que usa ActionBarCompat debe declarar que su tema hereda de los temas de ActionBarCompat .

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>



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?


Cambiar para importar android.support.v7.widget.SearchView me ayudó