Proxy de las nuevas API

En esta lección, se muestra cómo subclasificar las clases abstractas CompatTab y TabHelper, y cómo usar nuevas APIs. Tu aplicación puede usar esta implementación en dispositivos que ejecutan una versión de la plataforma que los admite.

Cómo implementar pestañas usando nuevas API

Las clases concretas para CompatTab y TabHelper que usan API más nuevas son una implementación de proxy. Dado que las clases abstractas definidas en la lección anterior reflejan las nuevas API (estructura de clase, firmas de métodos, entre otros), las clases concretas que usan estas API más nuevas simplemente hacen proxy con llamadas de métodos y sus resultados.

Puedes usar directamente API más nuevas en estas clases concretas (y no se producirán fallas en dispositivos anteriores) debido a la carga de clases diferida. Las clases se cargan y se inicializan en el primer acceso, creando una instancia de la clase o accediendo a uno de los campos o métodos estáticos por primera vez. Por lo tanto, siempre y cuando no instancias las implementaciones específicas de Honeycomb en los dispositivos anteriores a Honeycomb, la VM Dalvik no lanzará ninguna excepción de VerifyError.

Para seguir una buena convención de nombres en esta implementación, agrega el nivel de API o el nombre de código de versión de la plataforma correspondiente a las API requeridas por las clases concretas. Por ejemplo, las clases CompatTabHoneycomb y TabHelperHoneycomb pueden proporcionar la implementación de la pestaña nativa, ya que dependen de las API disponibles en Android 3.0 (API nivel 11) o posterior.

Diagrama de clases para la implementación de pestañas en Honeycomb

Figura 1: Diagrama de clases para la implementación de pestañas en Honeycomb

Cómo implementar CompatTabHoneycomb

CompatTabHoneycomb es la implementación de la clase abstracta CompatTab que TabHelperHoneycomb usa para hacer referencia a pestañas individuales. CompatTabHoneycomb simplemente envía por proxy todas las llamadas de método a su objeto ActionBar.Tab contenido.

Comienza a implementar CompatTabHoneycomb con las nuevas API de ActionBar.Tab:

Kotlin

class CompatTabHoneycomb internal constructor(val activity: Activity, tag: String) :
        CompatTab(tag) {
    ...
    // The native tab object that this CompatTab acts as a proxy for.
    private var mTab: ActionBar.Tab =
            // Proxy to new ActionBar.newTab API
            activity.actionBar.newTab()

    override fun setText(@StringRes textId: Int): CompatTab {
        // Proxy to new ActionBar.Tab.setText API
        mTab.setText(textId)
        return this
    }

    ...
    // Do the same for other properties (icon, callback, etc.)
}

Java

public class CompatTabHoneycomb extends CompatTab {
    // The native tab object that this CompatTab acts as a proxy for.
    ActionBar.Tab mTab;
    ...

    protected CompatTabHoneycomb(FragmentActivity activity, String tag) {
        ...
        // Proxy to new ActionBar.newTab API
        mTab = activity.getActionBar().newTab();
    }

    public CompatTab setText(int resId) {
        // Proxy to new ActionBar.Tab.setText API
        mTab.setText(resId);
        return this;
    }

    ...
    // Do the same for other properties (icon, callback, etc.)
}

Cómo implementar TabHelperHoneycomb

TabHelperHoneycomb es la implementación de la clase abstracta TabHelper que los proxy llaman por método a un ActionBar real, obtenido a partir de su contenido Activity.

Implementa TabHelperHoneycomb, que los proxy hacen llamadas de método a la API ActionBar:

Kotlin

class TabHelperHoneycomb internal constructor(activity: FragmentActivity) : TabHelper(activity) {

    private var mActionBar: ActionBar? = null

    override fun setUp() {
        mActionBar = mActionBar ?: mActivity.actionBar.apply {
            navigationMode = ActionBar.NAVIGATION_MODE_TABS
        }
    }

    override fun addTab(tab: CompatTab) {
        // Tab is a CompatTabHoneycomb instance, so its
        // native tab object is an ActionBar.Tab.
        mActionBar?.addTab(tab.getTab() as ActionBar.Tab)
    }
}

Java

public class TabHelperHoneycomb extends TabHelper {
    ActionBar actionBar;
    ...

    protected void setUp() {
        if (actionBar == null) {
            actionBar = activity.getActionBar();
            actionBar.setNavigationMode(
                    ActionBar.NAVIGATION_MODE_TABS);
        }
    }

    public void addTab(CompatTab tab) {
        ...
        // Tab is a CompatTabHoneycomb instance, so its
        // native tab object is an ActionBar.Tab.
        actionBar.addTab((ActionBar.Tab) tab.getTab());
    }

    // The other important method, newTab() is part of
    // the base implementation.
}

También debes leer: