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!

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?

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:

  • SearchView fuente personalizada en android
  • Espacio izquierdo en la barra de herramientas con SearchView android studio
  • ¿Cómo mover el icono de búsqueda de SearchView a la derecha?
  • Barra de Acción de Android SearchView Menu Icon Size
  • Android searchview setOnActionExpandListener en Honeycomb 3.2
  • Filtros de búsqueda y filtrar sugerencias
  • No se puede ocultar el teclado virtual de SearchView iconfiedbydefault (false)
  • Sugerencia de SearchView - Ancho de diseño: match_parent
  • No se puede llamar a void android.view.View.setElevation (float) en un objeto nulo en lapism / SearchView
  • SearchView como la aplicación Google Play Video
  • MenuItemCompat.setOnActionExpandListener no hace nada
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.