Menú Navegación Páginas

El blog de Antonio Leiva sobre diseño y desarrollo de interfaces en Android

Action Bar en versiones antiguas de Android con ActionBarSherlock

Action Bar en versiones antiguas de Android con ActionBarSherlock
  • Twitter
  • Facebook
  • Google Plus
  • LinkedIn

Hace un tiempo ya expliqué en otro tutorial cómo añadir la Action Bar para dispositivos pre-ICS mediante un ejemplo que se incluía en los proyectos de prueba de la Support Library. Aunque es una aproximación bastante buena, a día de hoy pienso que no es la mejor, y por eso paso a explicaros como utilizar otra librería.

Durante el Google I/O 2012, en una de las conferencias un asistente preguntó que si había intención de incluir la Action Bar en la librería de compatibilidad, y la respuesta fue tan directa como que no, que ya existe ActionBarSherlock para ello. Así que si los propios desarrolladores de Android piensan que es la mejor alternativa, por algo será.

Action Bar en versiones antiguas de Android con ActionBarSherlock

Lo increíble de esta librería es que para versiones que ya tienen la Action Bar usará el API nativo, mientras que para el resto de versiones (anteriores a ICS) empleará su propia implementación personalizada. Y por supuesto, es gratuita.

Tras las necesarias presentaciones, comenzamos. Primero necesitamos descargar la librería y añadirla a nuestro workspace como proyecto de tipo librería:

  • Descarga ActionBarSherlock desde su web.
  • Extráelo, y crea un nuevo proyecto usando como fuente existente la carpeta library, mediante la opción de Android Project from Existing Code. Si quieres cámbiale el nombre una vez importado (por defecto aparecerá como library)
  • Asegúrate de que está marcado el campo is Library en Properties – Android del proyecto.Action Bar en versiones antiguas de Android con ActionBarSherlock
  • Crea tu proyecto con uno de tus últimos APIs, ya que la librería necesita las referencias de la Action Bar, y añade el anterior como librería. Para ello, vamos donde antes, y justo debajo de add Library la añadimos. Si en la compilación tienes algún problema, echa un vistazo a los comentarios de esta entrada para solucionarlo, o pregunta tus dudas en caso de que no lo consigas.

Ya lo tienes todo preparado. Ahora es tan fácil como hacer que tus Activities hereden de SherlockActivity o alguno de sus derivados (SherlockFragment, SherlockListFragment…)

En el Android Manifest, cambia la versión mínima del SDK a la que quieras soportar (SherlockActionBar acepta desde la 2.1) y modifica el theme de tu aplicación para establecer el de Sherlock:


android:theme="@style/Theme.Sherlock"

Ejecuta tu aplicación, y ya podrás ver la ActionBar. A partir de aquí, si quieres recuperar la barra desde el código, tendrías que llamar al método getSupportActionBar() en lugar de getActionBar(). El resto de métodos son equivalentes a la barra de acción habitual, por lo que bastará con consultar el API de Android.

Action Bar en versiones antiguas de Android con ActionBarSherlock

¿Te ha gustado? Compártelo

32 Comentarios

  1. Para completar el post estaría bien aclarar el problema que existe con la Support Library a la hora de importar ActionBarSherlock en un proyecto nuevo o ya existente.

    saludos y enhorabuen por el post.

    • El problema radica realmente en añadir cualquier libreria, que ya use como dependencia la Support Library, a nuestro proyecto. Habria que quitar la Support library de nuestro proyecto para que use la de la libreria que hemos añadido.

      • Sí, yo siempre lo he hecho como dice Zetch, pero hoy pensándolo me he dado cuenta de que es un problema si queremos usar la última versión de la Support Library. Creo que la solución más óptima es quitarla de la librería de ActionBarSherlock y volver a añadir la última versión de la Support. Podría ocurrir que no compilase, pero al menos actualmente con la última versión de ActionBarSherlock y la última del Support Library funciona sin problema. ¿Imra, te referías a esto o hay alguna cosa que se nos escapa?

        • Hola, como hago para eliminar la Support library de mi proyecto.

          Saludos

          • Elimínala del Build Path

  2. Hola, que tal estoy intentando utilizar el ActionBarSherlock, para usarlo en mi aplicación, ya cargue la libreria y todo ahi sin problema, pero cuando hago una prueba, digamos en el emulador con las versiones de 4.x para arriba sin problema, pero cuando hago la prueba con un emulador 2.x, pues no jala lo que hace eclipse es abrir otro emulador en este caso abre el que tengo con la versión de android 4.x, hice los cambios en el manifest para cambiar la versión minima y todo pero nada sigue haciendo lo mismo. No se si de entrada cuando creo el nuevo proyecto lo este haciendo mal digamos que cuando creo el proyecto me aparece una venta un tanto diferente(actualizada) me aparece lo siguiente:
    Application Name: ActionB
    Project Name: ActionB
    Package Name: com.prueba.actionb
    Minimum Required SDK: API 16:ANDROID 4.1 (Jelly Bean)
    Target SDK: API 16:ANDROID 4.1 (Jelly Bean)
    Compile With: API 17: Android 4.1
    Theme: None
    con estos datos creo el proyecto y le agrego la libreria de sherlock hago los cambios correspondientes lo hecho andar en el emulador con android 4.0 y jala sin problema, pero cuando intento hacerlo con el emulador de android 2.3 nada. Hice los cambios en el manifest pero no se soluciona. No se si tenga que ver la parte de Compile Whith o que pueda ser. Te agradeceria mucho si me puedes ayudar u orientar al respecto racias

    • Hola David, has probado a arrancar primero el dispositivo virtual sobre el que quieres depurar y luego a lanzar la App?

  3. Hola a todos!, buen post, quisiera saber como incluir esta libreria para una aplicacion android 2.3, no quiero ejecutar en V4. Alguien sabe como puedo hacerlo??, gracias!

    • No es necesario ejecutarlo en v4, en las opciones de tu proyecto puedes seguir indicando para qué versiones quiere que funcione tu aplicación. Lo único que necesitas es el support package para la v4, que lo único que quiere decir es que todo lo que hay en ese paquete funciona desde esa versión.

  4. Hola, me parece una idea excelente, pero me da algunos problemas al momento de implementarlo, en el onCreateOptionsMenu(Menu menu) me da un error que no tiene sugerencias y no tengo idea de que lo causa, la activity ya hereda de SherlockActivity y eso no dio error, pero el llamado de getSupportActionBar() me da un error, entre las sugerencias me dice “Add caster to method receiver” y que el metodo no esta definido para el tipo MenuItem.

    el codigo de ese metodo es este:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.inicio, menu);
    SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getSupportActionBar();

    return super.onCreateOptionsMenu(menu);

    }

    • La actividad tiene que extender SherlockActivity, y hay que usar los métodos de soporte, getSupporActionBar y getSupportMenuInflater. Comprueba que todas las referencias son correctas a las de ActionBarSherlock y el Support Package, y no a las del SDK original.

  5. Hola, estoy desarrollando como proyecto fin de carrera una oficina virtual para una empresa, y me gustaría saber si por el tema de licencias y eso, si puede haber problemas por el uso del ActionBarSherlock en una aplicación comercial.

    Un saludo y muchas gracias.

    • La librería tiene licencia Apache 2.0, por lo que la puedes usar en proyectos comerciales sin problema. De lo que no estoy seguro es de si es necesario incluir una sección de licencias en la App e indicar que la estás usando, o si ni siquiera esto es necesario.

  6. Hola, excelente aportación!
    Me han surgido algunos errores de compilación al intentar adaptar la ActionBarSherlock a mi aplicación, tales como:

    – Al intentar cargar las opciones de menú en todas las activities, en las siguientes líneas:
    public boolean onCreateOptionsMenu(Menu menu) {
    …}

    public boolean onOptionsItemSelected(MenuItem item) {
    … }

    – Tengo una clase que me pinta mapas, y por tanto, hereda de la siguiente forma y también me da error porque no sé como es la clase de la que debería heredar ahora:
    public class VistaMapa extends android.support.v4.app.FragmentActivity {
    … }

    He probado con “SherlockFragmentActivity”, pero los métodos internos me dan error.

    Muchas gracias por el aporte crack!

    • Los dos primeros puede ser porque no se haya incluido por error en los import las clases de android en vez de las de actionBarsherlock (Menu y MenuItem, se llaman igual pero son de paquetes distintos). Para el tercero, creo que para usar mapas hace falta esta librería, aunque nunca me he visto en la situación:
      https://github.com/JakeWharton/ActionBarSherlock-Plugin-Maps
      Investígalo a ver si eso te vale. Saludos!

      • Efectivamente, en los import relacionados con la ActionbarSherlock solo tengo el siguiente:
        import com.actionbarsherlock.app.SherlockActivity;
        Por tanto, ¿me faltaría el de los menús? ¿Cómo lo importo?
        He probado a cambiar el nombre de los métodos de esta forma:
        -onCreateOptionsMenu –> onCreateSherlockOptionsMenu
        – onOptionsItemSelected –> onSherlockOptionsItemSelected

        y el error de dichas líneas se me ha quitado, pero ahora me aparece un error dentro de dicho método en las líneas del case:
        switch (item.getItemId()) {
        case R.id.MenuSolicitud:

        return true;
        case R.id.MenuBuscador:

        El error me dice: “case expressions must be constant expressions”, cuiando antes no tenía problema con eso.

        Respecto a los mapas, tocara investigar.

        • No, los métodos se llaman igual. Tienes que quitar los imports que habrá a Menu y MenuItem (del tipo android.view.MenuItem) y poner los de actionbarsherlock. Cuando le des a solucionar el error te deberían aparecer las dos opciones, aunque son:
          com.actionbarsherlock.view.Menu;
          com.actionbarsherlock.view.MenuItem;

          • Si así es, los he importado en todas las activities donde tengo menus, y he cambiado “getMenuInflater” por “getSupportMenuInflater”…hasta ahí ok.
            El problema esta en que ahora me da error en lo que te he comentado de los case dentro del método de opciones del menú.
            Gracias por tu atención y pronta respuesta.

  7. Una pregunta Antonio, ¿es necesario que todas mis activities hereden de SherlockActivity, o únicamente aquellas en las que deseo se vea la ActionBar?
    Por cierto, los problemas de ayer solucionados, aunque aún no consigo ver la ActionBar en mi interfaz.

    Saludos crack!

    • Hola Nacho. Lo suyo es que toda la aplicación la hagas de una manera u otra, independientemente de que unas activities usen ActionBar y otras no. Sobre todo por tener un estilo coherente en toda la aplicación. ¿Has indicado el tema en la actividad? Es raro que no te aparezca…

      • Muchas gracias Antonio, ya lo solucioné volviendo a importar de nuevo la librería, y corrigiendo algunos ajustes.

        – Por cierto, si en mi aplicación tengo una pantalla de presentación de la aplicación con el logotipo y poco más, ¿cómo puedo hacer para que me aparezca la Actionbar Sherlock en todas las activities menos en esa? Esa clase sigue heredada de ‘Activity’ y sin embargo me sale tmb la ActionBarSherlock, con lo que queda un poco feo.

        – Una última cosa, si configuro mi proyecto con un Target Google APIs 16 (v 4.1.2) y mi Manifest con:
        android:minSdkVersion=”7″
        android:targetSdkVersion=”16″
        ¿Cómo puedo hacer para probar mi aplicación en un emulador versión 2.3.3?
        Tengo creados un emulador de la v 2.3.3 y otro de la v 4.1.2, pero únicamente me deja seleccionar éste úlitmo.

        Muchas gracias, saludos!

        • Cambia el tema a la actividad en concreto y ponle el sherlock.notitlebar o algo así.

          Lo otro debería dejarte hacerlo sin problemas. Prueba primero a abrir el avd que quieres y después a lanzar la aplicación

  8. Hola Antonio, ¿sabes si el icono de la aplicación que aparece en el ActionBar tiene que ser el mismo icono que aparece en tu lista de aplicaciones de tu móvil?
    En caso de que no, como cambiar uno y otro.
    Gracias, saludos.

  9. Hola, en mi aplicación cuando paso de una activity a otra hay unos segundos de espera para cargar datos, y quiero mostrar un ProgressBar circular que da vueltas situado en la ActionBar mientras tanto.
    He conseguido situar el ProgressBar en la ActionBar y que empiece a girar al pulsar sobre un icono de la ActionBar con este código:

    “if(item.getItemId() == R.id.MenuProgress) {
    item.setActionView(new ProgressBar(this, null, android.R.attr.progressBarStyle));
    item.expandActionView();
    return true;
    }”

    pero lo que realmente quiero es que se ejecute al lanzar la nueva activity, es decir, invocarlo desde el método ‘onPreExecute()’ del AsyncTask que lanza la nueva clase.

    ¿Cómo puedo hacerlo?
    Gracias.

    • Hola Nacho, a ver si te sirve esto: en el onCreateOptionsMenu, guárdate ese item en un atributo de la clase (la activity). Después puedes utilizarlo en cualquier sitio. Si la AsyncTask es inline, ya lo tienes hecho, si no se lo puedes pasar en el constructor.

      • OK entiendo pero, ¿cómo guardo el item en un atributo de la clase?

        • private MenuItem mProgressItem;

          Y en el onCreateOptionsMenu:
          mProgressItem = menu.findItem(R.id.action_progress);

          • Gracias Antonio, después de unos ajustes funciona. El problema es que ahora no sé como quitar la rueda girando al volver de nuevo a la activity.
            He intentado lo siguiente en el ‘onPostExecute()’ del AsyncTask pero no funciona:
            mProgressItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);

  10. Leiva, ¿sabes cómo cambiar el color de texto de los iconos que aparecen en el ActionBarSherlock?

    Gracias.

    • Pues entiendo que el color va con el color de texto de la ActionBar, pero supongo que quieres cambiar sólo el color del texto de los iconos, verdad?

  11. saludes, estoy tratando de implementar el action sherlock en el 2.3 y me sale este error al colocar el tema de sherlock: Resource is no a Drawable (color or path)

Trackbacks/Pingbacks

  1. Personaliza tu Action Bar con Android Action Bar Style Generator - [...] Lo mejor de la aplicación es que podemos generar el resultado no sólo para la Action Bar Holo (la …
  2. Action Bar Style Generator para Android: Ejemplo práctico | LiME - [...] dicho resultado y lo añadiremos al proyecto. Usaré el que creamos para el tutorial sobre ActionBarSherlock, por lo que …
  3. 10 librerías gratuitas que todo desarrollador Android debe conocer - [...] ActionBar Sherlock [...]
  4. Modificar la barra de título de una aplicación Android | LiME Creative | LiME Creative Labs - [...] ocurra. La barra de título está un poco anticuada, y deberías plantearte la opción de usar la Action Bar, …
  5. Búsqueda en la ActionBar: cómo implementarla | LiME Creative Labs - [...] quieres usarlo en todas las versiones de Android, tendrás que crear el proyecto usando ActionBarSherlock. El código es prácticamente …
  6. ActionBarSherlock y ViewPagerIndicator: la pareja perfecta - [...] ActionBarSherlock y ViewPagerIndicator no sólo funcionan bien en conjunto, sino que son prácticamente imprescindibles para casi cualquier aplicación con …
  7. RefreshActionItem: Acción de refresco en tu ActionBarSherlock - [...] que sólo funciona con ActionBarSherlock, pero al fin y al cabo es lo que usamos en la mayoría de …

Deja tus comentarios