Diferencia entre ActionBarSherlock y ActionBar Compatibility

156

¿Cuál es la diferencia entre ActionBarSherlock y Action Bar Compatibility?

Hace unos días, Google acaba de lanzar la compatibilidad de ActionBar que me confunde mucho. ¿Es que la barra de acción de compatibilidad funciona igual que ActionBarSherlock y es la misma codificación?

Ejemplo: ¿El ícono de la aplicación para navegar "arriba" o ActionBar.Tab es compatible con Action Bar Compatibility?

xDragonZ
fuente
12
Para su información, escribí una publicación de blog sobre esto para el blog de Square: eng.squareup.com/2012/05/actionbarsherlock-as-a-base.html
Jake Wharton
3
youtube.com/… Esto es lo que Google piensa de ActionBarSherlock vs ActionBarCompact
Rolf ツ
Este es un hilo importante y útil, para aquellos que desean migrar de ABS a ABCompat. Gracias.
Ashokchakravarthi Nagarajan

Respuestas:

61

ActionBarSherlock le da a su aplicación una barra de acción independientemente de la versión de la API de Android en la que se ejecuta su aplicación. La Compatibilidad de la barra de acción le proporciona la barra de acción solo si el dispositivo en el que está ejecutando es API nivel 3.0 o superior.

* Tenga en cuenta que si el dispositivo en el que está ejecutando no es 3.0 o superior, ActionBarSherlock usará su propia implementación personalizada de la barra de acción, no una nativa.

--EDITAR--

Parece que las cosas han cambiado y en realidad ya no hay diferencia entre ActionBarSherlock y la Compatibilidad de la barra de acción. Por favor lea los comentarios a continuación para más detalles.

--EDITAR--

Después de haber usado ambos ahora, puedo decir que en realidad prefiero ActionBarSherlock a Action Bar Compatibility. ActionBarSherlock es realmente fácil y agradable de usar.

--EDIT-- Como se mencionó LOG_TAG, ahora hay soporte para la barra de acción en la Biblioteca de soporte de Android. Todavía no he tenido la oportunidad de usarlo, pero me imagino que es el mejor.

Kurtis Nusbaum
fuente
1
@Anidamo Gracias por el aviso. Puede que me esté volviendo loco, pero podría jurar que en un momento dado, la versión en el paquete de compatibilidad de Android no le dio uno si es anterior a 3.0. He modificado mi respuesta.
Kurtis Nusbaum
35
Además, la respuesta es totalmente incorrecta: el propósito del ejemplo de compatibilidad es admitir dispositivos anteriores a 3.0.
AlikElzin-kilaka
8
Google lanzó una nueva implementación de barra de acción compatible con versiones anteriores llamada ActionBarCompat que forma parte de la biblioteca de soporte r18. Las API de ActionBarCompat le permiten crear el patrón de diseño esencial de la barra de acción en su aplicación, con una amplia compatibilidad con Android 2.1.
LOG_TAG
3
El siguiente enlace le indica whyy howdebe usar la nueva API ActionBarCompat
VenoM
2
Solo para agregar, para aquellos que piensan que pueden querer la integración de Chromecast en su aplicación, les recomiendo usar la biblioteca appcompat. Las API de MediaRouter necesarias para la integración de Chromecast dependen de appcompat; ActionBarSherlock no se puede usar.
clu
113

ActionBarSherlock vs ActionBarCompat:

Solo quiero poner algunas diferencias de código entre ActionBarSherlock y ActionBarCompat Lib

 ActionBarSherlock vs ActionBarCompat ** texto seguro **

Podemos migrar algunas aplicaciones de ActionBarSherlock a ActionBarCompat:

pasos:

  1. Importar proyecto AppCompat .

  2. Reemplazar SherlockFragmentActivitycon ActionBarActivity.

  3. Reemplazar SherlockFragmentcon Fragment.

  4. Cambio Menu, MenuItemy getSupportMenuInflater()referencias. Modifique la forma en que obtiene las vistas de acción.

    mSearchView = (SearchView)MenuItemCompat.getActionView(mSearchItem)

  5. Modifique sus temas y estilos .

Para obtener más información, consulte estas diapositivas de + NickButcher (Google)

ingrese la descripción de la imagen aquí

Gracias a las fuentes: http://gmariotti.blogspot.in/2013/07/actionbarsherlock-vs-actionbarcompat.html http://antonioleiva.com/actionbarcompat-migrating-actionbarsherlock/

¡No olvides leer este desarrollador.android para obtener más información sobre ABC!

Nota: La configuración para pruebas unitarias de la misma manera que ABS desafortunadamente no es posible con la biblioteca de soporte.

Salida:

ingrese la descripción de la imagen aquí

Créditos: Gabriele Mariotti

LOG_TAG
fuente
1
Solo una actualización que ABS ahora también se puede agregar a los proyectos de Gradle a través compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'y no tiene que ser un proyecto de biblioteca.
ankushg
Gracias por la explicación detallada
Biswajit Das
41

Simplemente completando lo que @Kurtis Nusbaum con un ejemplo práctico.

ACTUALIZACIÓN: como dijo @ rudy-s, con la nueva biblioteca de soporte de Android (api 18), vi que ya tienen soporte integrado para actionbar (llamada clase ActionBarCompat).

Creé dos aplicaciones simples para mostrar la diferencia visual entre ActionBarSherlock y ActionBar Compatibility. Ver las imágenes comparativas:

Aplicación que usa biblioteca de compatibilidad

Aplicación que usa la biblioteca Sherlock

Ahora la apariencia cuando se presiona el botón de menú:

Aplicación que usa compatibilidad en el menú presionado

Aplicación usando Sherlock en el menú presionado


Como puede ver, las imágenes simplemente imponen lo que se dijo. La Compatibilidad de la barra de acción le proporciona la barra de acción solo si el dispositivo en el que está ejecutando es API nivel 3.0 o superior. Mientras Sherlock es más general.

A continuación puede ver la fuente de la aplicación.

El archivo xml del menú es el mismo:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
    android:id="@+id/action_1"
    android:orderInCategory="100"
    android:showAsAction="always"
    android:title="@string/action1"/>

<item
    android:id="@+id/action_2"
    android:orderInCategory="100"
    android:showAsAction="ifRoom"
    android:title="@string/action2"/>

<item
    android:id="@+id/action_3"
    android:orderInCategory="100"
    android:showAsAction="ifRoom"
    android:title="@string/action3"/>

<item
    android:id="@+id/action_settings"
    android:orderInCategory="100"
    android:showAsAction="never"
    android:title="@string/action_settings"/>

</menu>

Actividad de compatibilidad:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
     }

     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
     }
}

La actividad de Sherlock:

public class MainActivity extends SherlockActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
        getSupportMenuInflater().inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
    }

}

Se necesitaba una configuración adicional en la aplicación Sherlock:

<style name="AppBaseTheme" parent="Theme.Sherlock.Light.DarkActionBar">

ACTUALIZACIÓN: como dijo @ rudy-s, con la nueva biblioteca de soporte de Android (api 18), vi que ya tienen soporte integrado para actionbar (llamada clase ActionBarCompat).

Bruno Mateus
fuente
55
En realidad, esto no es del todo correcto. La biblioteca Compat puede y le ofrece una implementación de ActionBar en Gingerbread. Esta aplicación, por ejemplo, le ofrece un AB en GB y no utiliza Sherlock sino Compat. play.google.com/store/apps/details?id=uk.co.mxdata.rootle
Hamid
No es necesario, si extrae esa muestra de actionbarcompat (por ejemplo, del sdk android-17) y la compila en ADT, se ejecutará en un dispositivo GB con una barra de acciones. Solo lo probé para confirmar en un Desire HD con 2.3.5.
Hamid
Ok, lo tengo Sin embargo, ActionBarSherlock proporciona más funciones, ¿no?
Bruno Mateus
2
Con la nueva biblioteca de soporte de Android (api 18), vi que ya tienen soporte incorporado para actionbar (llamada clase ActionBarCompat).
Rudy s
GingerBEARD? Quiéralo.
Carlos P
39

Actionbar Sherlock es mucho más avanzado y mucho más ambicioso que el simple proyecto de compatibilidad Actionbar.

La compatibilidad de la barra de acción puede considerarse una "muestra" o un buen punto de partida si solo desea golpear una barra de acción en la parte superior de su aplicación.

ActionBarSherlock se basa en la biblioteca de compatibilidad y le proporciona (como el ejemplo de compatibilidad de la barra de acción) una Barra de acción en dispositivos anteriores a 3.0. Además, tiene características adicionales que no están presentes en el código de ActionBar Compat. Esto incluye características como, pero no limitado a

  • setNavigationMode (para pestañas y spinners en la barra de acción)
  • Fragmentos de diálogo
  • Barra de acción contextual (CAB), un menú que se hace cargo de la barra de acción, que se utiliza, por ejemplo, para selección múltiple (http://developer.android.com/design/patterns/new-4-0.html) Esta es una función de ICS ( !) Para esto, una implementación de la clase ActionMode (introducida en API nivel 11) tuvo que ser introducida en la biblioteca ActionbarSherlock
  • Implementaciones de Fragment y FragmentActivity: debido a que los fragmentos pueden implementar el menú onCreateOptions, debemos asegurarnos de que se utiliza SupportMenuInflater.
  • Dos temas no muy diferentes a Holo.Dark y Holo.Light (Theme.Sherlock, Theme.Sherlock.Light)
  • La función ICS "barra de acción dividida"

El único inconveniente que veo al usar ActionbarSherlock es que te encierras en esa biblioteca. Si por alguna razón se extinguirá en el futuro cercano, tendrá que mantenerlo usted mismo (por ejemplo, si no aparece la implementación de Jellybean). Esto es una molestia (no un gran problema) ya que todos sus fragmentos extienden SherlockFragemnt y todas sus actividades. SherlockActividad.

Glenn Bech
fuente
¿Me estoy perdiendo de algo? Parece que la selección múltiple NO es compatible con ABS
jiduvah
1
Perdón por el retraso. La selección múltiple no es por sí misma compatible con ABS. Sin embargo, puede implementar Multiselect utilizando el ABS "ActionMode", ya que ABS tiene sus propias implementaciones de las clases ActionMode. Al entrar en "modo de selección múltiple", debe configurar el modo de elección de ListView en CHOICE_MODE_MULTIPLE e invocar ActionMode llamando a getSherlockActivity (). StartActionMode (callback)
Glenn Bech
26

Bueno, la implementación de @Jake va mucho más allá de lo que es compatible con Actionbar, para ser más precisos, Actionbar Compat es solo un ejemplo básico de cómo puede admitir todas las aplicaciones con una pseudo-barra de acción para versiones anteriores de Honeycomb (API 13). Aunque su objetivo es la misma barra de acción compatible con cruces, tienen un enfoque diferente.

Acercamiento de la barra de acción

Esta implementación no hace uso de la biblioteca de compatibilidad de Android Compatibility, sino que crea una clase base llamada ActionBarActivity, crea una sola instancia de un Helper, este helper actúa como la propia fábrica que devuelve una implementación diferente para los tres segmentos de APIS.

La parte más interesante está en ActionbarBaseHelper , ya que tiene el código más importante, le sugiero que entienda esta clase y obtendrá el ejemplo completo.

Action Bar Sherlock

Bueno, esto es difícil porque no soy el autor, tal vez Jake pueda explicarlo más, pero lo intentaré.

Del mismo modo que el Sherlock compatible realiza diferentes implementaciones, pero una es para "Compat" y la otra es Native. Te obliga a extender ya sea desde SherlockActivity o desde SherlockFragmentActivity, porque estas dos clases base tienen el método para enviar ActionBar.

Este es un proyecto grande y complejo, que no se puede explicar en una sola publicación. Te sugiero que busques en el repositorio de Sherlock Github, echa un vistazo y, como dice Jeff Atwood

ingrese la descripción de la imagen aquí

Necronet
fuente
10
  • Creo firmemente que debe usarlo ActionBarCompatpara todos los proyectos nuevos que quieran admitir dispositivos más antiguos.

  • También podría tener sentido migrar proyectos existentes. Siga leyendo para saber por qué debería migrar o usar ActionBarCompat de inmediato y cómo migrar proyectos existentes.

¿Por qué debería preferir ActionBarCompat sobre ActionBarSherlock?

Hay muchas razones por las que debería preferir ActionbarCompat sobre ActionbarSherlock.

  1. En primer lugar, este proyecto es de Google, forma parte de la Biblioteca de soporte y, por lo tanto, probablemente admitirá nuevas cosas relacionadas con la barra de acción al mismo tiempo que Google las lanza con Android de serie.

  2. Otra buena razón es que admite la Navigation Drawer patternconfiguración inmediata, mientras que ActionBarSherlock no. Por lo tanto, si desea agregar este cajón a un proyecto / aplicación existente, debe migrar.

  3. Lo último e importante es que el creador de ActionBarSherlock, Jake Wharton, anunció en Google+ que se ha detenido el desarrollo posterior de ActionBarSherlock. ActionBarSherlock 4.4 es la última versión y puede obtener correcciones de errores, pero no habrá nuevas características: por lo tanto, si se incluye una nueva funcionalidad en actionbar, es posible que no se mantenga al día con actionbarsherlock.

Steve
fuente
7

¿Quizás deberíamos actualizar la respuesta porque Google publicó soporte oficial de Actionbar desde API18 ?

El siguiente bloque es del blog oficial sobre estas dos bibliotecas:

Si está utilizando una solución de terceros (como ActionBarSherlock), hay algunas razones para considerar la actualización:

  • Puede mantenerse actualizado a medida que evoluciona la API de la barra de acción.
  • Soporte integrado de navegación ancestral.
  • Uso de las clases de menú Marco y MenuItem.
  • Continúe utilizando la clase Fragmento de la biblioteca de soporte.
  • Soporte integrado para ActionBarDrawerToggle para usar con DrawerLayout.
  • Backport de PopupMenu.

ActionBarSherlock es una biblioteca sólida y bien probada que ha servido muy bien a los desarrolladores durante mucho tiempo. Si ya lo está utilizando y actualmente no requiere ninguno de los anteriores, no hay necesidad de migrar.

ruidge
fuente