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!
- Obtener la lista de lugares que rodean la ubicación actual del usuario
- Horizontal ProgressBar: Cambiar entre determinado e indeterminado
- ¿Cómo puedo añadir una vista de búsqueda a mi aplicación para Android?
- Cómo cambiar las sugerencias de búsqueda Color del texto
- Cómo llamar a onSearchRequested al presionar lupa
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
- Objeto serializable en la intención que devuelve como String
- Android Searchview OnQueryTextListener con base de datos no funciona
- Diálogo de búsqueda en Mono Android
- ¿Cómo utilizar un Seekbar en android como un seekBar, así como un progressBar simultáneamente?
- Cómo utilizar Algolia en Android con contenido de Firebase
- Actividad de búsqueda que se llama dos veces
- ¿Cómo implementar autocompletetextview con listview?
- La función VideoView seekto () es extremadamente incoherente
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); }