Angenommen, Sie möchten Tabs in der Aktionsleiste als primäre Navigationsmethode auf oberster Ebene in Ihrer Anwendung verwenden. Leider sind die ActionBar
APIs erst ab Android 3.0 (API-Level 11 oder höher) verfügbar. Wenn du deine App also für Geräte mit älteren Versionen der Plattform vertreiben möchtest, musst du eine Implementierung bereitstellen, die die neuere API unterstützt. Gleichzeitig muss ein Fallback-Mechanismus mit älteren APIs verwendet werden.
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 Abstraktionsschicht 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 zuerst fest, welche neueren Klassen Sie rückwärtskompatibel verwenden möchten, und erstellen dann abstrakte Klassen, die auf den öffentlichen Schnittstellen der neueren Klassen basieren. 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 benötigt wird.
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 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:
- Tab-Indikatoren sollten Text und ein Symbol enthalten.
- Tabs können einer Fragmentinstanz zugeordnet werden.
- 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 finden Sie unter 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).
Abstrakte ActionBar.Tab
Erstellen Sie als Erstes eine abstrakte Klasse, die einen Tab darstellt und die ActionBar.Tab
-Benutzeroberflä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.