Proxy vers les nouvelles API

Cette leçon vous explique comment créer une sous-classe des classes abstraites CompatTab et TabHelper, et comment utiliser de nouvelles API. Votre application peut utiliser cette implémentation sur les appareils exécutant une version de plate-forme compatible.

Implémenter des onglets à l'aide de nouvelles API

Les classes concrètes pour CompatTab et TabHelper qui utilisent des API plus récentes sont une implémentation de proxy. Étant donné que les classes abstraites définies dans la leçon précédente reflètent les nouvelles API (structure de classe, signatures de méthode, etc.), les classes concrètes qui utilisent ces API plus récentes proxy les appels de méthode et leurs résultats.

Vous pouvez utiliser directement des API plus récentes dans ces classes concrètes (sans plantage sur les appareils plus anciens) grâce au chargement différé des classes. Les classes sont chargées et initialisées lors du premier accès, en instanciant la classe ou en accédant à l'un de ses champs ou méthodes statiques pour la première fois. Ainsi, tant que vous n'instanciez pas les implémentations spécifiques à Honeycomb sur les appareils antérieurs à Honeycomb, la VM Dalvik ne génère aucune exception VerifyError.

Une bonne convention d'attribution de noms pour cette implémentation consiste à ajouter le niveau d'API ou le nom de code de la version de la plate-forme correspondant aux API requises par les classes concrètes. Par exemple, l'implémentation d'onglet native peut être fournie par les classes CompatTabHoneycomb et TabHelperHoneycomb, car elles s'appuient sur des API disponibles dans Android 3.0 (niveau d'API 11) ou version ultérieure.

Diagramme de classe pour l'implémentation des onglets Honeycomb.
Figure 1. Diagramme de classe pour l'implémentation Honeycomb des onglets.

Implémenter CompatTabHoneycomb

CompatTabHoneycomb est l'implémentation de la classe abstraite CompatTab que TabHelperHoneycomb utilise pour référencer des onglets individuels. CompatTabHoneycomb proxy tous les appels de méthode vers son objet ActionBar.Tab contenu.

Commencez à implémenter CompatTabHoneycomb à l'aide des nouvelles 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.)
}

Implémenter TabHelperHoneycomb

TabHelperHoneycomb est l'implémentation de la classe abstraite TabHelper qui proxy les appels de méthode vers un ActionBar réel, obtenu à partir de son Activity contenu.

Implémentez TabHelperHoneycomb, en proxy les appels de méthode vers 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.
}

À lire également