Questa lezione mostra come creare sottoclassi delle classi astratte CompatTab
e TabHelper
e utilizzare nuove API. La tua applicazione può utilizzare questa implementazione sui dispositivi che eseguono una versione della piattaforma che le supporta.
Implementare le schede utilizzando nuove API
Le classi concrete per CompatTab
e TabHelper
che utilizzano API più recenti sono un'implementazione 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 nuove API si limitano a effettuare chiamate al metodo proxy e i relativi risultati.
Puoi usare direttamente API più recenti in queste classi concrete, senza arresti anomali sui dispositivi precedenti, a causa del caricamento lento delle classi. I corsi vengono caricati e inizializzati al primo accesso, confermando la classe o accedendo per la prima volta a uno dei suoi campi o metodi statici. Pertanto, se non crei un'istanza delle implementazioni specifiche di Honeycomb sui dispositivi pre-Honeycomb, la VM Dalvik non genererà alcuna eccezione di tipo VerifyError
.
Una buona convenzione di denominazione per questa implementazione consiste nell'aggiungere il nome in codice del livello API o della versione della piattaforma corrispondente alle API richieste dalle classi concrete. Ad esempio, l'implementazione di una 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.
Implementare CompatTabHoneycomb
CompatTabHoneycomb
è l'implementazione della classe astratta CompatTab
che TabHelperHoneycomb
utilizza per fare riferimento a singole schede. CompatTabHoneycomb
esegue semplicemente il proxy di tutte le chiamate al metodo all'oggetto ActionBar.Tab
che contiene.
Inizia a implementare CompatTabHoneycomb
con 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 esegue il proxy delle chiamate di metodo a un ActionBar
effettivo, ottenuto dal suo Activity
contenuto.
Implementa TabHelperHoneycomb
, chiamate al metodo di proxy all'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. }