Proxy per le nuove API

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.

Diagramma della classe per l'implementazione delle schede Honeycomb.

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 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:

KotlinJava
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.)
}
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:

KotlinJava
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)
   
}
}
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.
}

Leggi anche