tutorial studio implement how ejemplo bar android android-actionbar compatibility android-support-library searchview

studio - searchview android



La biblioteca de soporte de Android ActionBar no funciona en el dispositivo 2.3 (1)

Hola amigos, implementé la biblioteca de soporte de ActionBar con v7 Appcompact. Extiendo mi clase de actividad con ActionBarActivity. A continuación es mi clase principal

import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.SearchView; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); MenuItem menuItem=menu.findItem(R.id.menu_settings); SearchView mSearchView=(SearchView)menuItem.getActionView(); return super.onCreateOptionsMenu(menu); } }

En el archivo de manifiesto declaro un tipo de tema como este

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.appcompactdemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.appcompactdemo.MainActivity" android:label="@string/app_name" android:theme="@style/Theme.AppCompat.Light.DarkActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>

en style.xml como abajo:

<style name="ExampleTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="homeAsUpIndicator">@drawable/new_indicator</item> <item name="android:homeAsUpIndicator">@drawable/new_indicator</item> </style>

El código anterior funciona correctamente con la versión 4.0 de Android, pero en el dispositivo 2.3 no funciona, da un error como:

java.lang.NoSuchMethodError: android.view.MenuItem.getActionView 07-26 04:11:40.900: E/AndroidRuntime(412): at com.example.appcompactdemo.MainActivity.onCreateOptionsMenu(MainActivity.java:24) 07-26 04:11:40.900: E/AndroidRuntime(412): at android.app.Activity.onCreatePanelMenu(Activity.java:2158) 07-26 04:11:40.900: E/AndroidRuntime(412): at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:224) 07-26 04:11:40.900: E/AndroidRuntime(412): at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:224) 07-26 04:11:40.900: E/AndroidRuntime(412): at android.support.v7.app.ActionBarActivityDelegateBase$1.run(ActionBarActivityDelegateBase.java:69) 07-26 04:11:40.900: E/AndroidRuntime(412): at android.os.Handler.handleCallback(Handler.java:587) 07-26 04:11:40.900: E/AndroidRuntime(412): at android.os.Handler.dispatchMessage(Handler.java:92) 07-26 04:11:40.900: E/AndroidRuntime(412): at android.os.Looper.loop(Looper.java:130) 07-26 04:11:40.900: E/AndroidRuntime(412): at android.app.ActivityThread.main(ActivityThread.java:3683) 07-26 04:11:40.900: E/AndroidRuntime(412): at java.lang.reflect.Method.invokeNative(Native Method) 07-26 04:11:40.900: E/AndroidRuntime(412): at java.lang.reflect.Method.invoke(Method.java:507) 07-26 04:11:40.900: E/AndroidRuntime(412): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 07-26 04:11:40.900: E/AndroidRuntime(412): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 07-26 04:11:40.900: E/AndroidRuntime(412): at dalvik.system.NativeStart.main(Native Method)

¿Alguna idea de cómo puedo resolverlo?


Creo que la respuesta a tu problema está en la guía oficial para desarrolladores :

Debes declarar el widget de búsqueda.

<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:yourapp="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/action_search" android:title="@string/action_search" android:icon="@drawable/ic_action_search" yourapp:showAsAction="ifRoom|collapseActionView" yourapp:actionViewClass="android.support.v7.widget.SearchView" /> </menu>

Si necesita configurar la vista de acción (como agregar detectores de eventos), puede hacerlo durante la devolución de llamada onCreateOptionsMenu (). Puede adquirir el objeto de vista de acción llamando al método estático MenuItemCompat.getActionView () y pasándole el elemento MenuItem correspondiente. Por ejemplo, el widget de búsqueda de la muestra anterior se adquiere así:

@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_activity_actions, menu); MenuItem searchItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); // <-- change your code to this // Configure the search info and add any event listeners ... return super.onCreateOptionsMenu(menu); }