Zusammenfassung der neuen APIs

Angenommen, Sie möchten Aktionsleisten-Tabs als primäre Form für die Navigation der obersten Ebene in Ihrer Anwendung verwenden. Die ActionBar APIs sind nur ab Android 3.0 (API-Level 11 oder höher) verfügbar. Wenn Sie Ihre Anwendung also für Geräte bereitstellen möchten, auf denen ältere Versionen der Plattform ausgeführt werden, müssen Sie eine Implementierung bereitstellen, die die neuere API unterstützt, während Sie einen Fallback-Mechanismus bereitstellen, der ältere APIs verwendet.

In dieser Klasse erstellen Sie eine UI-Komponente 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 zum Erstellen der Tab-Komponente eine Abstraktionsebene für die neuen Tab-APIs erstellen.

Auf Abstraktion vorbereiten

Bei der Abstraktion in der Programmiersprache Java werden mindestens eine Schnittstellen oder abstrakte Klasse erstellt, um Implementierungsdetails zu verbergen. Bei neueren Android-APIs können Sie abstraktionsbasierte Komponenten verwenden, 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 zunächst fest, welche neueren Klassen auf abwärtskompatible Weise verwendet werden sollen, und erstellen dann abstrakte Klassen basierend auf den öffentlichen Schnittstellen der neueren Klassen. Beim Definieren der Abstraktionsschnittstellen sollten Sie die neuere API so gut wie möglich spiegeln. Dies maximiert die Aufwärtskompatibilität und erleichtert es, die Abstraktionsebene in Zukunft zu verwerfen, wenn sie nicht mehr erforderlich ist.

Nachdem Sie abstrakte Klassen für diese neuen APIs erstellt haben, kann zur Laufzeit eine beliebige Anzahl von Implementierungen erstellt und ausgewählt werden. Aus Gründen der Abwärtskompatibilität können diese Implementierungen je nach erforderlichem API-Level variieren. Daher kann eine Implementierung kürzlich veröffentlichte APIs verwenden, während andere ältere APIs verwenden können.

Abstrakte Tab-Oberfläche erstellen

Um eine abwärtskompatible Version von Tabs zu erstellen, sollten Sie zunächst ermitteln, welche Funktionen und spezifischen APIs Ihre Anwendung benötigt. Angenommen, Sie haben bei Tabs der obersten Ebene die folgenden funktionalen Anforderungen:

  1. Die Tab-Anzeige sollte Text und ein Symbol enthalten.
  2. Tabs können einer Fragmentinstanz zugeordnet werden.
  3. Die Aktivität sollte in der Lage sein, Tabänderungen zu erkennen.

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

Die wichtigsten APIs für Tabs befinden sich in ActionBar und ActionBar.Tab. Dies sind die APIs, die Sie abstrahieren können, um Ihre Tabs versionsabhängig zu machen. Die Anforderungen für dieses Beispielprojekt erfordern eine Kompatibilität mit Eclair (API-Level 5), während die neuen Tab-Funktionen in Honeycomb (API-Level 11) genutzt werden. Unten sehen Sie ein Diagramm der Klassenstruktur zur Unterstützung dieser beiden Implementierungen und ihrer abstrakten Basisklassen (oder Schnittstellen).

Klassendiagramm mit abstrakten Basisklassen und versionsspezifischen Implementierungen.

Abbildung 1: Klassendiagramm mit abstrakten Basisklassen und versionsspezifischen Implementierungen.

Abstrakte ActionBar.Tab

Erstellen Sie als Erstes eine abstrakte Klasse für einen Tab, die die ActionBar.Tab-Oberfläche widerspiegelt:

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 allgemeiner Funktionen wie der Verknüpfung von Tab-Objekten mit Aktivitäten zu vereinfachen (nicht im Code-Snippet dargestellt).

Abstrakte ActionBar-Tab-Methoden

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

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