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:
- Tab-Indikatoren sollten Text und ein Symbol enthalten.
- Tabs können mit einer Fragmentinstanz verknüpft werden.
- 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.
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.