Proxy per le nuove API

Questa lezione mostra come creare sottoclassi delle 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.

Implementare le schede utilizzando le nuove API

Le classi concrete per CompatTab e TabHelper che utilizzano le 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 eseguono il proxy delle chiamate ai metodi e dei relativi risultati.

Puoi utilizzare direttamente le API più recenti in queste classi concrete, senza che si verifichino arresti anomali sui dispositivi precedenti, grazie al caricamento lazy delle classi. Le classi vengono caricate e inizializzate al primo accesso, ovvero quando viene creata un'istanza della classe o quando si accede per la prima volta a uno dei relativi campi o metodi statici. Pertanto, a condizione che non crei un'istanza delle implementazioni specifiche di Honeycomb sui dispositivi precedenti, la VM Dalvik non genererà eccezioni VerifyError.

Una buona convenzione di denominazione per questa implementazione consiste nell'aggiungere il livello API o il nome in codice 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 su API disponibili in Android 3.0 (livello API 11) o versioni successive.

Diagramma delle classi per l'implementazione delle schede di Honeycomb.
Figura 1. Diagramma delle classi per l'implementazione delle schede di Honeycomb.

Implementare CompatTabHoneycomb

CompatTabHoneycomb è l'implementazione della classe astratta CompatTab che TabHelperHoneycomb utilizza per fare riferimento alle singole schede. CompatTabHoneycomb esegue il proxy di tutte le chiamate ai metodi all'oggetto ActionBar.Tab contenuto.

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 esegue il proxy delle chiamate ai metodi a un ActionBar effettivo, ottenuto dal Activity contenuto.

Implementa TabHelperHoneycomb, eseguendo il proxy delle chiamate ai metodi 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.
}

Leggi anche