Zusammenfassung der neuen APIs

Angenommen, Sie möchten Tabs auf der Aktionsleiste als primäre Form der Navigation auf oberster Ebene in Ihrer App verwenden. Die ActionBar APIs sind nur unter Android 3.0 oder höher (API-Level 11 und höher) verfügbar. Wenn du deine App für Geräte mit früheren Versionen der Plattform bereitstellen möchtest, musst du eine Implementierung bereitstellen, die die neuere API unterstützt und gleichzeitig einen Fallback-Mechanismus bereitstellt, 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 zur Erstellung der Tab-Komponente eine Abstraktionsebene für die APIs für den neuen Tab erstellen.

Abstraktion vorbereiten

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

Bei diesem Ansatz legen Sie zuerst fest, welche neueren Klassen Sie abwärtskompatibel verwenden möchten, und erstellen dann abstrakte Klassen basierend auf den öffentlichen Schnittstellen der neueren Klassen. Beim Definieren der Abstraktionsschnittstellen sollten Sie die neuere API so weit wie möglich spiegeln. Dies maximiert die Aufwärtskompatibilität und erleichtert das zukünftige Entfernen der Abstraktionsebene, wenn sie nicht mehr benötigt wird.

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

Benutzeroberfläche eines abstrakten Tabs erstellen

Um eine abwärtskompatible Version von Tabs zu erstellen, sollten Sie zunächst ermitteln, welche Funktionen und spezifischen APIs Ihre Anwendung erfordert. Angenommen, Sie haben die folgenden Funktionsanforderungen an Bereichs-Tabs auf oberster Ebene:

  1. Tabanzeigen sollten Text und ein Symbol enthalten.
  2. Tabs können einer Fragmentinstanz zugeordnet werden.
  3. Die Aktivität sollte auf Tabänderungen warten können.

Wenn Sie diese Anforderungen im Voraus vorbereiten, können Sie den Umfang der Abstraktionsebene steuern. Das bedeutet, dass Sie weniger Zeit auf das Erstellen mehrerer Implementierungen Ihrer Abstraktionsebene aufwenden 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 müssen, um Ihre Tabs versionsspezifisch zu machen. Die Anforderungen für dieses Beispielprojekt erfordern die Kompatibilität mit Eclair (API-Level 5), während gleichzeitig die neuen Tabfunktionen in Honeycomb (API-Level 11) genutzt werden können. Ein Diagramm der Klassenstruktur zur Unterstützung dieser beiden Implementierungen und ihrer abstrakten Basisklassen (oder Schnittstellen) wird unten gezeigt.

Klassendiagramm mit abstrakten Basisklassen und versionsspezifischen Implementierungen

Abbildung 1: Klassendiagramm mit abstrakten Basisklassen und versionsspezifischen Implementierungen

Abstrakte ActionBar.Tab

Beginnen Sie mit dem Erstellen Ihrer Tab-Abstraktionsebene, indem Sie eine abstrakte Klasse erstellen, die einen Tab darstellt, der die ActionBar.Tab-Schnittstelle spiegelt:

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

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

Methoden für den abstrakten ActionBar-Tab

Definieren Sie als Nächstes eine abstrakte Klasse, mit der Sie Tabs wie ActionBar.newTab() und ActionBar.addTab() erstellen und zu 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