Proxy per le nuove API

Questa lezione mostra come sottoclasse le 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.

Implementa 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 delle classi, firme dei metodi e così via), le classi concrete che utilizzano queste API più recenti semplicemente inviano un proxy alle chiamate ai metodi e ai loro risultati.

Puoi usare direttamente API più recenti in queste classi concrete, senza arrestarti in modo anomalo sui dispositivi precedenti, grazie al caricamento lento delle classi. I corsi vengono caricati e inizializzati al primo accesso, per rafforzare la classe o accedere per la prima volta a uno dei suoi metodi o campi statici. Di conseguenza, se non crei un'istanza per le implementazioni specifiche di Honeycomb sui dispositivi pre-Honeycomb, la VM Dalvik non genererà alcuna eccezione VerifyError.

Una buona convenzione di denominazione per questa implementazione è quella di aggiungere il nome in codice del livello API o 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 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 alle singole schede. CompatTabHoneycomb si limita a eseguire il proxy di tutte le chiamate al metodo nell'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.)
}

Implementare TabHelperHoneycomb

TabHelperHoneycomb è l'implementazione della classe astratta TabHelper che rappresenta il proxy delle chiamate di metodo a un ActionBar effettivo, ottenuto dal suo contenuto Activity.

Implementa TabHelperHoneycomb, chiamate al metodo proxy per l'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 anche