Únete a ⁠ #Android11: The Beta Launch Show el 3 de junio.

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 API. Tu app 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 tipo proxy. Dado que las clases abstractas definidas en la lección anterior reflejan las nuevas API (estructura de clase, firmas de métodos, etc.), 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 crees instancias de las implementaciones específicas de Honeycomb en los dispositivos anteriores a Honeycomb, la VM Dalvik no mostrará ninguna excepción 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 aplicación de la clase abstracta CompatTab que usa TabHelperHoneycomb para hacer referencia a las pestañas individuales. CompatTabHoneycomb simplemente hace proxy con todas las llamadas de método al 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 hace proxy con llamadas de método a una ActionBar real, que se obtiene de la Activity contenida.

Implementa TabHelperHoneycomb y haz proxy con llamadas de método a la API de 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: