Cómo usar componentes de compatibilidad de versiones

Ahora que tienes dos implementaciones de TabHelper y CompatTab (una para Android 3.0 y versiones posteriores, y una para versiones anteriores de la plataforma), es hora de hacer algo con ellas. En esta lección, analizaremos cómo crear la lógica para alternar entre estas implementaciones, crear diseños con reconocimiento de versión y, finalmente, usar el componente de IU retrocompatible.

Cómo agregar la lógica de alternancia

La clase abstracta TabHelper funciona como una fábrica para crear instancias TabHelper y CompatTab apropiadas para versiones, en función de la versión actual de la plataforma del dispositivo:

Kotlin

    sealed class TabHelper(protected val mActivity: FragmentActivity, protected val tag: String) {

        abstract fun setUp()

        abstract fun addTab(tab: CompatTab)

        // Usage is tabHelper.newTab("tag")
        fun newTab(tag: String): CompatTab =
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                    CompatTabHoneycomb(mActivity, tag)
                } else {
                    CompatTabEclair(mActivity, tag)
                }

        companion object {
            // Usage is TabHelper.createInstance(activity)
            fun createInstance(activity: FragmentActivity): TabHelper =
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                        TabHelperHoneycomb(activity)
                    } else {
                        TabHelperEclair(activity)
                    }
        }
    }
    

Java

    public abstract class TabHelper {
        ...
        // Usage is TabHelper.createInstance(activity)
        public static TabHelper createInstance(FragmentActivity activity) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                return new TabHelperHoneycomb(activity);
            } else {
                return new TabHelperEclair(activity);
            }
        }

        // Usage is tabHelper.newTab("tag")
        public CompatTab newTab(String tag) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                return new CompatTabHoneycomb(mActivity, tag);
            } else {
                return new CompatTabEclair(mActivity, tag);
            }
        }
        ...
    }
    

Cómo crear un diseño de actividad con compatibilidad de versiones

El siguiente paso es proporcionar diseños para tu actividad que puedan admitir las implementaciones de dos pestañas. Para la implementación anterior (TabHelperEclair), debes asegurarte de que el diseño de tu actividad contenga un TabWidget y un TabHost, además de un contenedor para el contenido de la pestaña:

res/layout/main.xml:

    <!-- This layout is for API level 5-10 only. -->
    <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="5dp">

            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1" />

        </LinearLayout>
    </TabHost>
    

Para la implementación de TabHelperHoneycomb, todo lo que necesitas es un FrameLayout para el contenido de la pestaña, ya que ActionBar proporciona los indicadores de pestaña:

res/layout-v11/main.xml:

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/tabcontent"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    

Durante el tiempo de ejecución, Android decidirá qué versión del diseño main.xml se va a aumentar según la versión de la plataforma. Esta es la misma lógica que se mostró en la sección anterior para determinar qué implementación de TabHelper se debe usar.

Cómo usar TabHelper en tu actividad

En el método onCreate() de tu actividad, puedes obtener un objeto TabHelper y agregar pestañas con el siguiente código:

Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        setContentView(R.layout.main)

        TabHelper.createInstance(this).apply {
            setUp()

            newTab("photos")
                    .setText(R.string.tab_photos)
                    .also { photosTab ->
                        addTab(photosTab)
                    }

            newTab("videos")
                    .setText(R.string.tab_videos)
                    .also { videosTab ->
                        addTab(videosTab)
                    }
        }
    }
    

Java

    @Override
    public void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.main);

        TabHelper tabHelper = TabHelper.createInstance(this);
        tabHelper.setUp();

        CompatTab photosTab = tabHelper
                .newTab("photos")
                .setText(R.string.tab_photos);
        tabHelper.addTab(photosTab);

        CompatTab videosTab = tabHelper
                .newTab("videos")
                .setText(R.string.tab_videos);
        tabHelper.addTab(videosTab);
    }
    

Cuando se ejecuta la app, este código aumento el diseño de la actividad correspondiente y crea una instancia de un objeto TabHelperHoneycomb o TabHelperEclair. En realidad, la clase concreta que se usa es opaca para la actividad, ya que comparten la interfaz común de TabHelper.

A continuación, se muestran dos capturas de pantalla de esta implementación, que se ejecuta en dispositivos Android 2.3 y Android 4.0.

Ejemplo de captura de pantalla de pestañas que se ejecutan en un dispositivo Android 2.3 (con TabHelperEclair) Ejemplo de captura de pantalla de pestañas que se ejecutan en un dispositivo Android 4.0 (con TabHelperHoneycomb)

Figura 1: Ejemplos de capturas de pantalla de pestañas compatibles con versiones anteriores que se ejecutan en un dispositivo Android 2.3 (con TabHelperEclair) y un dispositivo Android 4.0 (con TabHelperHoneycomb)

También debes leer: