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](https://developer.android.google.cn/static/images/training/backward-compatible-ui-classes-honeycomb.png?authuser=5&hl=es)
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. }