Zusammenfassung der neuen APIs

Angenommen, Sie möchten Aktionsleistentabs als primäre Form der Navigation auf oberster Ebene in Ihrer Anwendung verwenden. Leider sind die ActionBar-APIs nur in Android 3.0 oder höher (API-Level 11+) verfügbar. Wenn Sie Ihre Anwendung also auf Geräten mit älteren Versionen der Plattform bereitstellen möchten, müssen Sie eine Implementierung bereitstellen, die die neuere API unterstützt, und gleichzeitig einen Fallback-Mechanismus verwenden, der ältere APIs nutzt.

In dieser Klasse erstellen Sie eine Benutzeroberflächenkomponente mit Tabs, die abstrakte Klassen mit versionsspezifischen Implementierungen verwendet, um Abwärtskompatibilität zu gewährleisten. In dieser Lektion wird beschrieben, wie Sie als ersten Schritt zur Erstellung der Tab-Komponente eine Abstraktionsebene für die neuen Tab-APIs erstellen.

Abstraktion vorbereiten

Abstraktion in der Programmiersprache Java beinhaltet die Erstellung einer oder mehrerer Schnittstellen oder abstrakter Klassen, um Implementierungsdetails zu verbergen. Bei neueren Android-APIs können Sie die Abstraktion verwenden, um versionsabhängige Komponenten zu erstellen, die die aktuellen APIs auf neueren Geräten verwenden und auf älteren Geräten auf ältere, kompatiblere APIs zurückgreifen.

Bei diesem Ansatz legen Sie zuerst fest, welche neueren Klassen Sie abwärtskompatibel verwenden möchten. Anschließend erstellen Sie abstrakte Klassen, die auf den öffentlichen Schnittstellen der neueren Klassen basieren. Bei der Definition der Abstraktionsschnittstellen sollten Sie die neuere API so weit wie möglich widerspiegeln. Dadurch wird die Vorwärtskompatibilität maximiert und es ist einfacher, die Abstraktionsebene in Zukunft zu entfernen, wenn sie nicht mehr erforderlich ist.

Nachdem Sie abstrakte Klassen für diese neuen APIs erstellt haben, können beliebig viele Implementierungen erstellt und zur Laufzeit ausgewählt werden. Aus Gründen der Abwärtskompatibilität können sich diese Implementierungen hinsichtlich des erforderlichen API-Levels unterscheiden. So kann eine Implementierung kürzlich veröffentlichte APIs verwenden, während andere ältere APIs nutzen.

Abstrakte Tab-Schnittstelle erstellen

Um eine abwärtskompatible Version von Tabs zu erstellen, sollten Sie zuerst festlegen, welche Funktionen und spezifischen APIs Ihre Anwendung benötigt. Angenommen, Sie haben für Tabs für Abschnitte auf oberster Ebene die folgenden funktionalen Anforderungen:

  1. Tab-Indikatoren sollten Text und ein Symbol enthalten.
  2. Tabs können mit einer Fragmentinstanz verknüpft werden.
  3. Die Aktivität sollte auf Tab-Änderungen reagieren können.

Wenn Sie diese Anforderungen im Voraus vorbereiten, können Sie den Umfang Ihrer Abstraktionsebene steuern. So können Sie weniger Zeit mit der Erstellung mehrerer Implementierungen Ihrer Abstraktionsebene verbringen und Ihre neue abwärtskompatible Implementierung schneller verwenden.

Die wichtigsten APIs für Tabs befinden sich in ActionBar und ActionBar.Tab. Diese APIs müssen abstrahiert werden, damit Ihre Tabs versionsabhängig sind. Die Anforderungen für dieses Beispielprojekt erfordern Kompatibilität bis zurück zu Eclair (API-Level 5) und gleichzeitig die Nutzung der neuen Tab-Funktionen in Honeycomb (API-Level 11). Ein Diagramm der Klassenstruktur zur Unterstützung dieser beiden Implementierungen und ihrer abstrakten Basisklassen (oder Schnittstellen) folgt.

Abstrakte Basisklassen und versionsspezifische Implementierungen.
Abbildung 1. Klassendiagramm der abstrakten Basisklassen und versionsspezifischen Implementierungen.

ActionBar.Tab abstrahieren

Erstellen Sie zuerst eine abstrakte Klasse, die einen Tab darstellt und die ActionBar.Tab-Schnittstelle widerspiegelt, um mit der Erstellung Ihrer Tab-Abstraktionsebene zu beginnen:

Kotlin

sealed class CompatTab(val tag: String) {
    ...
    abstract fun getText(): CharSequence
    abstract fun getIcon(): Drawable
    abstract fun getCallback(): CompatTabListener
    abstract fun getFragment(): Fragment

    abstract fun setText(text: String): CompatTab
    abstract fun setIcon(icon: Drawable): CompatTab
    abstract fun setCallback(callback: CompatTabListener): CompatTab
    abstract fun setFragment(fragment: Fragment): CompatTab
    ...
}

Java

public abstract class CompatTab {
    ...
    public abstract CompatTab setText(int resId);
    public abstract CompatTab setIcon(int resId);
    public abstract CompatTab setTabListener(
            CompatTabListener callback);
    public abstract CompatTab setFragment(Fragment fragment);

    public abstract CharSequence getText();
    public abstract Drawable getIcon();
    public abstract CompatTabListener getCallback();
    public abstract Fragment getFragment();
    ...
}

Sie können hier eine abstrakte Klasse anstelle einer Schnittstelle verwenden, um die Implementierung gemeinsamer Funktionen wie die Verknüpfung von Tab-Objekten mit Aktivitäten zu vereinfachen (nicht im Code-Snippet gezeigt).

Abstrakte ActionBar-Tab-Methoden

Definieren Sie als Nächstes eine abstrakte Klasse, mit der Sie Tabs erstellen und einer Aktivität hinzufügen können, z. B. ActionBar.newTab() und ActionBar.addTab():

Kotlin

sealed class TabHelper(protected val activity: FragmentActivity) {
    ...

    abstract fun setUp()

    fun newTab(tag: String): CompatTab {
        // This method is implemented in a later lesson.
    }

    abstract fun addTab(tab: CompatTab)

    ...
}

Java

public abstract class TabHelper {
    ...

    public CompatTab newTab(String tag) {
        // This method is implemented in a later lesson.
    }

    public abstract void addTab(CompatTab tab);

    ...
}

In den nächsten Lektionen erstellen Sie Implementierungen für TabHelper und CompatTab, die sowohl mit älteren als auch mit neueren Plattformversionen funktionieren.

Weitere Informationen