android android-actionbar actionbarsherlock android-actionbar-compat

android - ¿Cuáles son los problemas comunes al migrar de ActionBarSherlock a ActionBarCompat?



android-actionbar android-actionbar-compat (2)

Hice algunas migraciones y anoté todos los problemas que encontré. Ninguno fue serio, pero tomó tiempo para investigar. Pude migrar una aplicación bastante grande en un par de horas después de saber todo esto. Que esto ayude a acelerar el proceso de migración.

¿Cómo convierto de ActionBarSherlock a ActionBarCompat?

Nota: Dado que la biblioteca de soporte v22.1.0, la clase ActionBarActivity está en desuso. Deberías usar AppCompatActivity en su lugar. Lea aquí para obtener más información: ¿Cuál es la mejora de AppCompatActivity sobre ActionBarActivity?

== Cambiar las bibliotecas ==

Vaya a las propiedades de la aplicación, elimine ActionBarSherlock y agregue ActionBarCompat en su lugar. Esto requiere que la biblioteca de la aplicación v7 esté presente, consulte http://developer.android.com/tools/support-library/setup.html para obtener más información. Siga las instrucciones con precisión, ActionBarCompat debe ser un proyecto de biblioteca.

El paralelo no funciona (fácilmente) ya que muchos atributos están en ambas bibliotecas.

No se desanime por cientos de errores después de reemplazar las bibliotecas. La gran mayoría desaparece automáticamente.

== Solucionar errores XML ==

Lo primero es corregir todos los errores XML para permitir la compilación y encontrar otros errores.

Reemplace el tema sherlock con el tema ActionBarCompat, por ejemplo
<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">

Eliminar doble attr, por ejemplo, <attr name="buttonBarStyle" format="reference" /> .

Por ahora elimina todos tus estilos de barra de acción individuales. Vea más abajo cómo manejar estos.

== corregir errores de compilación ==

Elija las actividades más fáciles primero. ActionBarCompat no distingue Activity y FragmentActivity, ambos ahora son ActionBarActivity.

Elimine las importaciones de ActionBarSherlock y extienda a ActionBarActivity ( import android.support.v7.app.ActionBarActivity; )

Después de guardar, esto debería reducir dramáticamente los errores en la actividad.

Arregle primero los errores en torno a los menús y, por ahora, ignore los errores de fragmentos, deberían desaparecer más tarde.

== Reemplazos ==

Importaciones:

  • importar com.actionbarsherlock.app.SherlockActivity; -> importar android.support.v7.app.ActionBarActivity;
  • importar com.actionbarsherlock.app.SherlockFragmentActivity; -> importar android.support.v7.app.ActionBarActivity;
  • importar com.actionbarsherlock.app.SherlockFragment; -> importar android.support.v4.app.Fragment;
  • importar com.actionbarsherlock.app.SherlockListFragment; -> importar android.support.v4.app.ListFragment;
  • importar com.actionbarsherlock.app.SherlockListActivity; -> importar android.support.v7.app.ActionBarActivity; (ver ListActivity / SherlockListActivity)
  • importar com.actionbarsherlock.view.Menu; -> importar android.view.Menu;
  • importar com.actionbarsherlock.view.MenuItem; -> importar android.view.MenuItem;
  • importar com.actionbarsherlock.view.MenuInflater; -> importar android.view.MenuInflater;
  • importar com.actionbarsherlock.view.Window; -> importar android.view.Window;
  • importar com.actionbarsherlock.widget.SearchView; -> importar android.support.v7.widget.SearchView;
  • importar com.actionbarsherlock.widget.SearchView.OnQueryTextListener -> import android.support.v7.widget.SearchView.OnQueryTextListener;

Reemplazos de código:

  • SherlockActivity -> ActionBarActivity
  • SherlockFragmentActivity -> ActionBarActivity
  • SherlockListActivity -> ListActivity (vea ListActivity / SherlockListActivity)
  • SherlockListFragment -> ListFragment;

  • getSupportMenuInflater -> getMenuInflater

  • getSherlockActivity () -> getActivity ()
  • com.actionbarsherlock.widget.SearchView.OnQueryTextListener () -> OnQueryTextListener (ver SearchView)

  • m.setShowAsAction (MenuItem.SHOW_AS_ACTION_ALWAYS); -> MenuItemCompat.setShowAsAction (m, MenuItem.SHOW_AS_ACTION_ALWAYS);

Cambios típicos de código para ActionBarCompat

  • getActionBar () -> getSupportActionBar ()
  • invalidateOptionsMenu () -> supportInvalidateOptionsMenu ()

== Fragmento ==

El fragmento no cubre la funcionalidad ActionBarCompat. Este es un problema al intentar llamar a getSupportActionBar.

Esto se puede resolver utilizando el método onAttach:

@Override public void onAttach(Activity activity) { super.onAttach(activity); ((ActionBarActivity)activity).getSupportActionBar().setDisplayHomeAsUpEnabled(false); }

Por lo general, esto se controla mejor en FragmentActivity.

== SearchView ==

Esto resultó ser un poco complicado.

Reemplace algo como esto:

MenuItem searchItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) searchItem.getActionView();

con

MenuItem searchItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);

También tienes que ajustar tu menú:

<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_search" android:actionViewClass="com.actionbarsherlock.widget.SearchView" android:icon="@android:drawable/ic_menu_search" android:orderInCategory="80" android:showAsAction="always|collapseActionView" android:title="@string/action_search"/> </menu>

con

<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/action_search" android:icon="@android:drawable/ic_menu_search" android:orderInCategory="80" android:title="@string/action_search" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="always|collapseActionView"/> </menu>

aplicación: debe definirse para que sea compatible con las versiones de Android antes de las 11.
SearchView necesita ser compatible con la clase v7.

== ListActivity / SherlockListActivity ==

ActionBarCompat de ListActivity no es compatible, por lo tanto, las funciones cruciales de ListActivity deben implementarse en el manual, que es bastante simple:

private ListView mListView; protected ListView getListView() { if (mListView == null) { mListView = (ListView) findViewById(android.R.id.list); } return mListView; } protected void setListAdapter(ListAdapter adapter) { getListView().setAdapter(adapter); } protected ListAdapter getListAdapter() { ListAdapter adapter = getListView().getAdapter(); if (adapter instanceof HeaderViewListAdapter) { return ((HeaderViewListAdapter)adapter).getWrappedAdapter(); } else { return adapter; } }

== Estilos ==

Se puede lograr una barra de acción con estilo, consulte la publicación original de Google: http://android-developers.blogspot.de/2013/08/actionbarcompat-and-io-2013-app-source.html

Un cuadro de searchView con estilo es más difícil:
Esto funciona:

MenuItem searchItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); SearchView.SearchAutoComplete theTextArea = (SearchView.SearchAutoComplete) searchView.findViewById(R.id.search_src_text); theTextArea.setTextColor(getResources().getColor(R.color.yourColor));

Ver estos mensajes:

== Ejemplo ==

El cajón de navegación de Google con la barra de acción Sherlock incluye todo el código original (ahora con el objetivo de admitir biblioteca) y el formato. Solo algunos atributos tuvieron que reemplazarse por otros similares, ya que solo están disponibles a partir de v11 en adelante.

Descargar en: https://github.com/GunnarBs/NavigationDrawerWithActionBarCompat

== Ver también ==

Me gustaría eliminar ActionBarSherlock de mi aplicación y reemplazarlo con el ActionBarCompat estándar.

  • ¿Cómo implemento ActionBarCompat?
  • ¿Cómo migro las activitas?
  • ¿Qué importaciones reemplazan a las importaciones de ActionBarSherlock?
  • ¿Cuáles son los problemas típicos?