Cómo abstraer las nuevas API

Supongamos que deseas usar las pestañas de la barra de acciones como la forma principal de navegación de nivel superior en tu aplicación. Lamentablemente, las API de la ActionBar solo están disponibles en Android 3.0 o versiones posteriores (API nivel 11 o superior). Por lo tanto, si deseas distribuir tu aplicación a dispositivos que ejecutan versiones anteriores de la plataforma, debes proporcionar una implementación que admita la API más reciente y, al mismo tiempo, ofrecer un mecanismo de resguardo que use las API anteriores.

En esta clase, compilarás un componente de interfaz de usuario (IU) con pestañas que utilice clases abstractas con implementaciones específicas de la versión, a fin de proporcionar retrocompatibilidad. En esta lección, se describe cómo crear una capa de abstracción para las nuevas API de pestañas como el primer paso hacia la compilación del componente de pestañas.

Cómo preparar la abstracción

En el lenguaje de programación Java, la abstracción implica la creación de una o más interfaces o clases abstractas a fin de ocultar los detalles de la implementación. En el caso de las API de Android más nuevas, puedes usar la abstracción para compilar componentes compatibles con la versión que usan las API actuales en dispositivos más nuevos, y recurrir a API más antiguas y compatibles en dispositivos más antiguos.

Cuando uses este enfoque, primero determina qué clases más nuevas quieres utilizar de una manera retrocompatible y, luego, crea clases abstractas basadas en las interfaces públicas de las clases más nuevas. Cuando definas las interfaces de abstracción, debes duplicar la API más nueva tanto como sea posible. Esto maximiza la compatibilidad con versiones posteriores y facilita la eliminación de la capa de abstracción en el futuro, cuando ya no sea necesaria.

Después de crear clases abstractas para estas nuevas API, es posible crear y elegir cualquier número de implementaciones durante el tiempo de ejecución. Por motivos de retrocompatibilidad, estas implementaciones pueden variar según el nivel de API requerido. Por lo tanto, una implementación puede usar API lanzadas recientemente, mientras que otras pueden usar API anteriores.

Cómo crear una interfaz con pestañas abstractas

Para crear una versión de las pestañas compatibles con versiones anteriores, primero debes determinar las funciones y las API específicas que requiere tu app. En el caso de las pestañas de nivel superior, supongamos que tienes los siguientes requisitos funcionales:

  1. Los indicadores de las pestañas deben mostrar texto y un ícono.
  2. Se pueden asociar las pestañas con una instancia de fragmento.
  3. La actividad debería poder detectar los cambios de pestañas.

Preparar estos requisitos de antemano te permite controlar el alcance de la capa de abstracción. Esto significa que puedes pasar menos tiempo creando varias implementaciones de tu capa de abstracción y comenzar a usar la nueva implementación retrocompatible antes de lo esperado.

Las API clave para las pestañas están en ActionBar y ActionBar.Tab. Estas son las API que se deben abstraer para que tus pestañas reconozcan las versiones. Los ejemplos de este proyecto requieren retrocompatibilidad con Eclair (API nivel 5), al tiempo que aprovechan las nuevas funciones de pestañas de Honeycomb (API nivel 11). A continuación, se muestra un diagrama de la estructura de clases para admitir estas dos implementaciones y sus clases base abstractas (o interfaces).

Diagrama de clases base abstractas y de implementaciones específicas de la versión.

Figura 1: Diagrama de clases base abstractas y de implementaciones específicas de la versión.

Clase abstracta ActionBar.Tab

Comienza a compilar tu capa de abstracción de pestañas mediante la creación de una clase abstracta que represente una pestaña, la cual refleje la interfaz de ActionBar.Tab:

Kotlin

sealed class CompatTab(val tag: String) {
    ...
    abstract fun getText(): CharSequence
    abstract fun getIcon(): Drawable
    abstract fun getCallback(): CompatTabListener
    abstract fun getFragment(): Fragment

    abstract fun setText(text: String): CompatTab
    abstract fun setIcon(icon: Drawable): CompatTab
    abstract fun setCallback(callback: CompatTabListener): CompatTab
    abstract fun setFragment(fragment: Fragment): CompatTab
    ...
}

Java

public abstract class CompatTab {
    ...
    public abstract CompatTab setText(int resId);
    public abstract CompatTab setIcon(int resId);
    public abstract CompatTab setTabListener(
            CompatTabListener callback);
    public abstract CompatTab setFragment(Fragment fragment);

    public abstract CharSequence getText();
    public abstract Drawable getIcon();
    public abstract CompatTabListener getCallback();
    public abstract Fragment getFragment();
    ...
}

Aquí, puedes usar una clase abstracta, en lugar de una interfaz, a fin de simplificar la implementación de funciones comunes, como la asociación de objetos de pestañas con actividades (no se muestra en el fragmento de código).

Métodos de la pestaña abstracta ActionBar

A continuación, define una clase abstracta que te permita crear y agregar pestañas a una actividad, como ActionBar.newTab() y ActionBar.addTab():

Kotlin

sealed class TabHelper(protected val activity: FragmentActivity) {
    ...

    abstract fun setUp()

    fun newTab(tag: String): CompatTab {
        // This method is implemented in a later lesson.
    }

    abstract fun addTab(tab: CompatTab)

    ...
}

Java

public abstract class TabHelper {
    ...

    public CompatTab newTab(String tag) {
        // This method is implemented in a later lesson.
    }

    public abstract void addTab(CompatTab tab);

    ...
}

En las próximas lecciones, crearás implementaciones para TabHelper y CompatTab que funcionen en las versiones de plataforma más antiguas y más recientes.

También puedes leer: