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 su cui è in esecuzione una versione della piattaforma che la supporta.
Implementare 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 della classe, firme dei metodi e così via), le classi concrete che utilizzano queste API più recenti fanno semplicemente da proxy per le chiamate ai metodi e i relativi risultati.
Puoi utilizzare direttamente le API più recenti in questi classi concreti e non avere arresti anomali sui dispositivi precedenti grazie al caricamento delle classi lazy. 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 è aggiungere il nome del codice di 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
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.) }
Implementa TabHelperHoneycomb
TabHelperHoneycomb
è l'implementazione della classe astratta TabHelper
che esegue il proxy delle chiamate di metodo a un ActionBar
effettivo, ottenuto dal 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. }