Android SearchView no funciona

He intentado actualizar todas las bibliotecas, pero todavía tengo errores. Puedo ejecutar la aplicación en el simulador, pero cuando exporte el APK y lo ejecute en un dispositivo Android real, la aplicación no funciona.

MinSdkVersion es 8, targetSdkVersion es 19. ¡Por favor ayuda!

Menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:example="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_showTC" android:orderInCategory="100" android:showAsAction="never" android:title="Terms and Conditions"/> <item android:id="@+id/action_search" android:title="Search" android:orderInCategory="100" example:showAsAction="ifRoom|collapseActionView" example:actionViewClass="android.support.v7.widget.SearchView"/> </menu> 

SearchView

 @Override public boolean onOptionsItemSelected(MenuItem item){ if(item.getItemId() == R.id.action_showTC){ startActivity(new Intent(MainActivity.this, T_C.class)); return true; }else{ return super.onOptionsItemSelected(item); } } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SupportMenuItem searchMenuItem = ((SupportMenuItem) menu.findItem(R.id.action_search)); SearchView searchView = (SearchView) searchMenuItem.getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); return super.onCreateOptionsMenu(menu); } 

manifiesto

  <activity android:name="com.agehk.queue.SearchResultsActivity" android:parentActivityName="com.agehk.queue.MainActivity" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> 

Searchable.xml

 <?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:hint="Search Queue" android:label="@string/app_name" /> 

Error

 09-04 15:57:13.105: W/SupportMenuInflater(17184): Cannot instantiate class: android.support.v7.widget.SearchView 09-04 15:57:13.105: W/SupportMenuInflater(17184): java.lang.NoSuchMethodException: <init> [class android.content.Context] 09-04 15:57:13.105: W/SupportMenuInflater(17184): at java.lang.Class.getConstructorOrMethod(Class.java:423) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at java.lang.Class.getConstructor(Class.java:397) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v7.internal.view.fa(Unknown Source) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v7.internal.view.fa(Unknown Source) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v7.internal.view.fb(Unknown Source) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v7.internal.view.da(Unknown Source) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v7.internal.view.d.inflate(Unknown Source) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at com.agehk.queue.MainActivity.onCreateOptionsMenu(Unknown Source) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.app.Activity.onCreatePanelMenu(Activity.java:2577) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v4.app.j.onCreatePanelMenu(Unknown Source) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v7.aga(Unknown Source) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v7.ana(Unknown Source) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v7.agonCreatePanelMenu(Unknown Source) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v7.aoonCreatePanelMenu(Unknown Source) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:414) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:777) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:199) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:835) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.view.Choreographer.doCallbacks(Choreographer.java:626) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.view.Choreographer.doFrame(Choreographer.java:589) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:821) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.os.Handler.handleCallback(Handler.java:730) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.os.Handler.dispatchMessage(Handler.java:92) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.os.Looper.loop(Looper.java:150) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.app.ActivityThread.main(ActivityThread.java:5390) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at java.lang.reflect.Method.invokeNative(Native Method) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at java.lang.reflect.Method.invoke(Method.java:525) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 09-04 15:57:13.105: W/SupportMenuInflater(17184): at dalvik.system.NativeStart.main(Native Method) 09-04 15:57:13.105: D/AndroidRuntime(17184): Shutting down VM 09-04 15:57:13.105: W/dalvikvm(17184): threadid=1: thread exiting with uncaught exception (group=0x42f05500) 09-04 15:57:13.105: E/AndroidRuntime(17184): FATAL EXCEPTION: main 09-04 15:57:13.105: E/AndroidRuntime(17184): java.lang.NullPointerException 09-04 15:57:13.105: E/AndroidRuntime(17184): at com.agehk.queue.MainActivity.onCreateOptionsMenu(Unknown Source) 09-04 15:57:13.105: E/AndroidRuntime(17184): at android.app.Activity.onCreatePanelMenu(Activity.java:2577) 09-04 15:57:13.105: E/AndroidRuntime(17184): at android.support.v4.app.j.onCreatePanelMenu(Unknown Source) 09-04 15:57:13.105: E/AndroidRuntime(17184): at android.support.v7.aga(Unknown Source) 09-04 15:57:13.105: E/AndroidRuntime(17184): at android.support.v7.ana(Unknown Source) 09-04 15:57:13.105: E/AndroidRuntime(17184): at android.support.v7.agonCreatePanelMenu(Unknown Source) 09-04 15:57:13.105: E/AndroidRuntime(17184): at android.support.v7.aoonCreatePanelMenu(Unknown Source) 09-04 15:57:13.105: E/AndroidRuntime(17184): at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:414) 09-04 15:57:13.105: E/AndroidRuntime(17184): at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:777) 09-04 15:57:13.105: E/AndroidRuntime(17184): at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:199) 09-04 15:57:13.105: E/AndroidRuntime(17184): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:835) 09-04 15:57:13.105: E/AndroidRuntime(17184): at android.view.Choreographer.doCallbacks(Choreographer.java:626) 09-04 15:57:13.105: E/AndroidRuntime(17184): at android.view.Choreographer.doFrame(Choreographer.java:589) 09-04 15:57:13.105: E/AndroidRuntime(17184): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:821) 09-04 15:57:13.105: E/AndroidRuntime(17184): at android.os.Handler.handleCallback(Handler.java:730) 09-04 15:57:13.105: E/AndroidRuntime(17184): at android.os.Handler.dispatchMessage(Handler.java:92) 09-04 15:57:13.105: E/AndroidRuntime(17184): at android.os.Looper.loop(Looper.java:150) 09-04 15:57:13.105: E/AndroidRuntime(17184): at android.app.ActivityThread.main(ActivityThread.java:5390) 09-04 15:57:13.105: E/AndroidRuntime(17184): at java.lang.reflect.Method.invokeNative(Native Method) 09-04 15:57:13.105: E/AndroidRuntime(17184): at java.lang.reflect.Method.invoke(Method.java:525) 09-04 15:57:13.105: E/AndroidRuntime(17184): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 09-04 15:57:13.105: E/AndroidRuntime(17184): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 09-04 15:57:13.105: E/AndroidRuntime(17184): at dalvik.system.NativeStart.main(Native Method) 09-04 15:57:13.115: D/BatteryStatsImpl(445): noteStopWakeLocked com.google.android.gms isFromForeground = false 09-04 15:57:13.115: W/ActivityManager(445): Force finishing activity com.agehk.queue/.MainActivity 

Para API antes de 11, debe inicializar los elementos de barra de acción en modo de compatibilidad:

 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); MenuItem searchMenuItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView)MenuItemCompat.getActionView(searchMenuItem); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); return true; } 

Actualizar:
Así pues, intenté reproducirlo en el emulador de la API 8 y en 4.4 KitKat. Por desgracia, mi dispositivo 2.3.8 se bricked hace un tiempo, por lo que no podía comprobar en el hardware con baja API. Lo que puedo sugerirle:
1. Compruebe que SearchView se importa desde android.support.v7.widget.SearchView;
2. Comprobar que el recurso del menú es correcto:

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" <----------- init compatible namespace xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity" > <item android:id="@+id/action_showTC" android:orderInCategory="100" android:title="@string/terms_and_conditions" app:showAsAction="never"/> <----------- use compatible namespace <item android:id="@+id/action_search" android:title="@string/search" android:orderInCategory="100" <---------- use different value app:showAsAction="ifRoom|collapseActionView" app:actionViewClass="android.support.v7.widget.SearchView"/> </menu> 

3. devuelve true de onCreateOptionsMenu si no hay procesamiento subyacente (la clase de actividad no está subclasificada)

UPDATE2: ¡ LO CONSEGUÍ! Probablemente se extiende desde la clase de Activity . Debe ser ActioBarActivity :

 public class MainActivity extends ActionBarActivity { ... 

Agregue el siguiente código a proguard-rules.pro

 -keep class android.support.v7.widget.SearchView { *; } 

¿Ha habilitado Proguard en su compilación? Si es así, puede asegurarse de que las bibliotecas appcompat se encuentren en la lista de exclusión de Proguard (en proguard.cfg). Un enfoque de fuerza bruta es mantener todas las clases de biblioteca de soporte con:

  -keep class android.support.v4.app.** { *; } -keep interface android.support.v4.app.** { *; } -keep class android.support.v7.app.** { *; } -keep interface android.support.v7.app.** { *; } 

En mi caso, tuve una clase que extendió el SearchView de la biblioteca de soporte, así que añadí esto a mi proguard.cfg:

 -keep public class * extends android.support.v7.widget.SearchView { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); } 

Los constructores se mencionan específicamente para evitar el error:

 java.lang.NoSuchMethodException: <init> [class android.content.Context] 

Yo tambien tengo

 Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.setOnQueryTextListener(android.support.v7.widget.ao)' on a null object reference 

Al lanzar mi versión de lanzamiento (con proguard / minify habilitado).

Añadiendo esto a las reglas proguard lo arreglaron:

 -keep class android.support.v7.widget.SearchView { *; } 

Esto mantendrá el widget SearchView, pero todavía permitirá que proguard deseche cualquier otra clase de biblioteca de soporte que no esté usando, por lo que mantendrá su versión de lanzamiento bien y ordenada.

Después de largas horas de investigación una solución simple de este problema, es decir, simplemente agregue

 -keep class android.support.v7.widget.SearchView { *; } 

En el archivo app / proguard / android.proguard de AndroidStudio.

¡Aclamaciones!

Mínimo requerido para proguard-rules.pro

 -keep class android.support.v7.widget.SearchView { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); } 

Tuve que añadir esto y ahora funciona bien:

 -keep class android.support.v7.widget.SearchView { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); } -keep interface android.support.v7.widget.SearchView { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); } 
  • Android: onSeekCompleteListener con VideoView
  • Cómo obtener enfoque para EditText y navegar usando D-pad en Android TV
  • Android SearchView Ocultar el teclado al iniciar
  • Mejores Prácticas para el Manejo de la Búsqueda
  • SearchManager.getSearchableInfo (getComponentName ()) devuelve null
  • ¿Son posibles varias clases SearchRecentSuggestionsProvider en la aplicación de Android?
  • ¿Cómo implementar la búsqueda difusa con FTS3 de SQLite?
  • ActionBar SearchView no se está expandiendo completamente en modo horizontal
  • Cambiar la barra de acción
  • Creación de un filtro de texto (como búsqueda rápida) para un Spinner en Android
  • Cómo realizar T9 Búsqueda de contactos por número en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.