Questa lezione mostra come sottoclasse le classi astratte CompatTab
e TabHelper
e utilizzare le nuove API. La tua applicazione può utilizzare questa implementazione sui dispositivi che eseguono una versione della piattaforma che le supporta.
Implementa le schede utilizzando le nuove API
Le classi concrete per CompatTab
e TabHelper
che utilizzano API più recenti sono un'implementazione di proxy. Poiché le classi astratte definite nella lezione precedente rispecchiano le nuove API (struttura delle classi, firme dei metodi e così via), le classi concrete che utilizzano queste API più recenti semplicemente inviano un proxy alle chiamate ai metodi e ai loro risultati.
Puoi usare direttamente API più recenti in queste classi concrete, senza arrestarti in modo anomalo sui dispositivi precedenti, grazie al caricamento lento delle classi. I corsi vengono caricati e inizializzati al primo accesso, per rafforzare la classe o accedere per la prima volta a uno dei suoi metodi o campi statici. Di conseguenza, se non crei un'istanza per le implementazioni specifiche di Honeycomb sui dispositivi pre-Honeycomb, la VM Dalvik non genererà alcuna eccezione VerifyError
.
Una buona convenzione di denominazione per questa implementazione è quella di aggiungere il nome in codice del livello API o della versione della piattaforma corrispondente alle API richieste dalle classi concrete. Ad esempio, l'implementazione della scheda nativa può essere fornita dalle classi CompatTabHoneycomb
e TabHelperHoneycomb
, poiché si basano sulle API disponibili in Android 3.0 (livello API 11) o versioni successive.
![Diagramma della classe per l'implementazione delle schede Honeycomb.](https://developer.android.com/static/images/training/backward-compatible-ui-classes-honeycomb.png?authuser=8&hl=it)
Figura 1. Diagramma della classe per l'implementazione delle schede Honeycomb.
Implementare CompatTabHoneycomb
CompatTabHoneycomb
è l'implementazione della classe astratta CompatTab
che TabHelperHoneycomb
utilizza per fare riferimento alle singole schede. CompatTabHoneycomb
si limita a eseguire il proxy di tutte le chiamate al metodo nell'oggetto ActionBar.Tab
che contiene.
Inizia a implementare CompatTabHoneycomb
utilizzando le nuove API 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.) }
Implementare TabHelperHoneycomb
TabHelperHoneycomb
è l'implementazione della classe astratta TabHelper
che rappresenta il proxy delle chiamate di metodo a un ActionBar
effettivo, ottenuto dal suo contenuto Activity
.
Implementa TabHelperHoneycomb
, chiamate al metodo proxy per l'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. }