Auf die neuen APIs umstellen

In dieser Lektion erfahren Sie, wie Sie die abstrakten Klassen CompatTab und TabHelper unterklassen und neue APIs verwenden. Ihre Anwendung kann diese Implementierung auf Geräten verwenden, auf denen eine Plattformversion ausgeführt wird, die sie unterstützt.

Tabs mit neuen APIs implementieren

Die konkreten Klassen für CompatTab und TabHelper, die neuere APIs verwenden, sind eine Proxy-Implementierung. Da die in der vorherigen Lektion definierten abstrakten Klassen die neuen APIs widerspiegeln (Klassenstruktur, Methodensignaturen usw.), leiten die konkreten Klassen, die diese neueren APIs verwenden, Methodenaufrufe und ihre Ergebnisse weiter.

Dank des verzögerten Klassenladens können Sie neuere APIs direkt in diesen konkreten Klassen verwenden, ohne dass es auf älteren Geräten zu Abstürzen kommt. Klassen werden beim ersten Zugriff geladen und initialisiert. Das kann beim Instanziieren der Klasse oder beim ersten Zugriff auf eines ihrer statischen Felder oder eine ihrer statischen Methoden geschehen. Solange Sie die Honeycomb-spezifischen Implementierungen nicht auf Geräten vor Honeycomb instanziieren, löst die Dalvik VM keine VerifyError-Ausnahmen aus.

Eine gute Namenskonvention für diese Implementierung besteht darin, den API-Level oder den Codenamen der Plattformversion anzuhängen, die den von den konkreten Klassen benötigten APIs entspricht. Die native Tab-Implementierung kann beispielsweise von den Klassen CompatTabHoneycomb und TabHelperHoneycomb bereitgestellt werden, da sie auf APIs angewiesen sind, die in Android 3.0 (API-Level 11) oder höher verfügbar sind.

Klassendiagramm für die Honeycomb-Implementierung von Tabs.
Abbildung 1. Klassendiagramm für die Honeycomb-Implementierung von Tabs.

CompatTabHoneycomb implementieren

CompatTabHoneycomb ist die Implementierung der abstrakten Klasse CompatTab, die von TabHelperHoneycomb verwendet wird, um auf einzelne Tabs zu verweisen. CompatTabHoneycomb leitet alle Methodenaufrufe an das enthaltene ActionBar.Tab-Objekt weiter.

Beginnen Sie mit der Implementierung von CompatTabHoneycomb mit den neuen ActionBar.Tab-APIs:

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

TabHelperHoneycomb implementieren

TabHelperHoneycomb ist die Implementierung der abstrakten Klasse TabHelper, die Methodenaufrufe an eine tatsächliche ActionBar weiterleitet, die aus der enthaltenen Activity abgerufen wird.

Implementieren Sie TabHelperHoneycomb und leiten Sie Methodenaufrufe an die ActionBar-API weiter:

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

Weitere Informationen