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

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

Dovresti leggere inoltre