NullPointerException en SearchView con ActionBarSherlock
Estoy utilizando ActionBarSherlock
y Support Library v4. Esto está en una "SherlockFragmentActivity".
Estoy recibiendo un Nullpointer en la línea 269, que se hace referencia a continuación. He verificado SearchView es nulo, no SearchManager. Sin embargo, el menu
también es nulo, así, no estoy seguro de si eso es normal? Importante: SÓLO es nulo en mis pruebas de Android 4.0 y 4.1. En 2.3, funciona muy bien!
- Biblioteca de soporte de Android 24.0.0 no muestra texto en SearchView
- Quitar icono de la vista de búsqueda del texto de la pista
- Puntero nulo en ExpandedView para la búsqueda de ActionBar
- El widget de búsqueda no está funcionando en el release apk
- SearchManager.getSearchableInfo (getComponentName ()) devuelve null
Aquí está mi código de SearchView
:
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.menu, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); // line 269 searchView.setSearchableInfo( searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(true); searchView.setSubmitButtonEnabled(true); return true; }
Tengo esto como mi elemento de menú ahora.
<item android:id="@+id/menu_search" android:actionViewClass="com.actionbarsherlock.widget.SearchView" android:icon="@android:drawable/ic_menu_search" android:showAsAction="always" android:title="search"/>
LogCat
FATAL EXCEPTION: main java.lang.NullPointerException at com.---.---.master.MainFragmentActivity .setupSearchView(MainFragmentActivity.java:269) at com.---.---.master.MainFragmentActivity.onCreateOptionsMenu( MainFragmentActivity.java:258) at android.support.v4.app.Watson.onCreatePanelMenu(Watson.java:45) at com.actionbarsherlock.ActionBarSherlock.callbackCreateOptionsMenu( ActionBarSherlock.java:559) at com.actionbarsherlock.internal.ActionBarSherlockCompat.preparePanel( ActionBarSherlockCompat.java:479) at com.actionbarsherlock.internal.ActionBarSherlockCompat .dispatchInvalidateOptionsMenu(ActionBarSherlockCompat.java:272) at com.actionbarsherlock.internal.ActionBarSherlockCompat$1.run( ActionBarSherlockCompat.java:984) at android.os.Handler.handleCallback(Handler.java:587) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:3683) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run( ZygoteInit.java:839) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) at dalvik.system.NativeStart.main(Native Method)
Importaciones:
import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.SherlockFragmentActivity; import com.actionbarsherlock.app.SherlockListFragment; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.widget.SearchView; import android.app.SearchManager;
Una vez más, obtengo el puntero nulo en SÓLO el emulador 4.0 y el dispositivo 4.1. App funciona muy bien en 2.3. En un momento, pre-ActionBarSherlock, utilizando el código SAME, excepto la importación de SearchView
través de la forma normal (no Sherlock) que funcionó muy bien en 4.0. Estoy tratando de hacer que mi aplicación compatible con versiones anteriores y se rompió las versiones más recientes de Android, pero funciona muy bien en los más antiguos.
EDIT: En realidad era Null en 2.3 y Cast Issue en 4.0+ cuando el elemento de menú tenía android:actionViewClass="android.app.SearchView"
Entonces lo cambié a android:actionViewClass="com.actionbarsherlock.widget.SearchView"
y ahora FIXED en 2.3 y Null en 4.0+
ACTUALIZACIÓN: Parecía arreglarlo con un hack:
He añadido una carpeta de menu-v11
añadido un archivo duplicado de menu.xml con un solo cambio de elemento: android:actionViewClass="android.app.SearchView"
, de lo contrario es idéntico al otro archivo menu.xml.
En Java, hice esto:
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.menu, menu); MenuItem searchItem = menu.findItem(R.id.menu_search); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { SearchView searchView = (SearchView) searchItem.getActionView(); searchView.setSearchableInfo(searchManager .getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(true); searchView.setSubmitButtonEnabled(true); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { setupNewSearchView(searchItem, searchManager); } return true; } @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void setupNewSearchView(MenuItem searchItem, SearchManager searchManager) { android.widget.SearchView searchView = (android.widget.SearchView) searchItem.getActionView(); searchView.setSearchableInfo(searchManager .getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(true); searchView.setSubmitButtonEnabled(true); }
Bueno, funciona, pero no lo estoy poniendo como una respuesta todavía, porque parece que forma hack de hacerlo. Abierto a mejores ideas?
- Buscar a través de RecyclerView usando Searchview
- Buscar sugerencias de diferentes tablas en diferentes actividades
- Cómo colapsar completamente un SearchView después de un elemento seleccionado?
- Cómo diseñar un SearchView en la barra de acciones de Android
- Cuándo cerrar Cursor utilizado en SimpleCursorAdapter
- Estilizar la vista de búsqueda de android y la lista desplegable en la barra de acciones
- Creación de un SearchView que se parezca a las directrices de diseño del material
- ¿Cómo cambiar el fondo de la barra de acción al hacer clic en el menú "Buscar"?
Hay un problema con attrs faltantes para v14 (y v11?) En ActionBarSherlock (o ActionBarSherlock + HoloEverywhere + Theme.Sherlock.Light.DarkActionBar?).
Solución simple y detalles en el hilo de la cuestión …
Está intentando utilizar dos clases completamente diferentes, ambas denominadas SearchView pero en paquetes diferentes. No puede simplemente lanzar un objeto de una clase a otra. Com.actionbarsherlock.widget.Searchview es diferente de android.widget.SearchView. Por lo tanto, searchView
es null en la línea 269.
Sería relevante para nosotros ver las importaciones desde la parte superior de su archivo Java.
Probablemente, la vista a la que hace referencia R.id.menu_search es un android.widget.SearchView y su código espera que sea un com.actionbarsherlock.widget.Searchview.
Agregue un atributo de tema a su archivo de manifiesto bajo las etiquetas de cada una de las actividades que va a utilizar una ActionBar
. Puede crear su propio tema personalizado o utilizar uno de los ActionBarSherlock
predeterminados ofrecidos por ActionBarSherlock
.
<activity android:name="com.example.MyActivityWithActionBar" ... android:theme="@style/Theme.Sherlock.Light"> </activity>
Más información sobre:
- LEDs compatibles con el dispositivo Android
- Cómo probar una aplicación de Android en un AVD con un nivel de API inferior al de Eclipse