Nachdem Sie nun zwei Implementierungen von TabHelper und CompatTab haben – eine für Android 3.0 und höher und eine für frühere Versionen der Plattform –, ist es an der Zeit, etwas damit zu tun. In dieser Lektion wird erläutert, wie Sie die Logik für das Umschalten zwischen diesen Implementierungen erstellen, versionsabhängige Layouts erstellen und schließlich die abwärtskompatible UI-Komponente verwenden.
Umschaltlogik hinzufügen
Die abstrakte Klasse TabHelper dient als Factory zum Erstellen versionsabhängiger TabHelper- und CompatTab-Instanzen, basierend auf der Plattformversion des aktuellen Geräts:
Kotlin
sealed class TabHelper(protected val mActivity: FragmentActivity, protected val tag: String) { abstract fun setUp() abstract fun addTab(tab: CompatTab) // Usage is tabHelper.newTab("tag") fun newTab(tag: String): CompatTab = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { CompatTabHoneycomb(mActivity, tag) } else { CompatTabEclair(mActivity, tag) } companion object { // Usage is TabHelper.createInstance(activity) fun createInstance(activity: FragmentActivity): TabHelper = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { TabHelperHoneycomb(activity) } else { TabHelperEclair(activity) } } }
Java
public abstract class TabHelper { ... // Usage is TabHelper.createInstance(activity) public static TabHelper createInstance(FragmentActivity activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { return new TabHelperHoneycomb(activity); } else { return new TabHelperEclair(activity); } } // Usage is tabHelper.newTab("tag") public CompatTab newTab(String tag) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { return new CompatTabHoneycomb(mActivity, tag); } else { return new CompatTabEclair(mActivity, tag); } } ... }
Versionsabhängiges Aktivitätslayout erstellen
Als Nächstes müssen Sie Layouts für Ihre Aktivität bereitstellen, die die beiden Tab-Implementierungen unterstützen können. Für die ältere Implementierung (TabHelperEclair) muss Ihr Aktivitätslayout ein TabWidget und TabHost sowie einen Container für Tab-Inhalte enthalten:
res/layout/main.xml :
<!-- This layout is for API level 5-10 only. --> <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="5dp"> <TabWidget android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout> </TabHost>
Für die TabHelperHoneycomb-Implementierung benötigen Sie nur ein FrameLayout, das die Tab-Inhalte enthält, da die Tab-Indikatoren von der ActionBar bereitgestellt werden:
res/layout-v11/main.xml :
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="match_parent" />
Zur Laufzeit entscheidet Android je nach Plattformversion, welche Version des main.xml-Layouts aufgebläht werden soll. Dies ist dieselbe Logik, die im vorherigen Abschnitt verwendet wurde, um zu bestimmen, welche TabHelper-Implementierung verwendet werden soll.
TabHelper in Ihrer Aktivität verwenden
In der onCreate()-Methode Ihrer Aktivität können Sie ein TabHelper-Objekt abrufen und mit dem folgenden Code Tabs hinzufügen:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... setContentView(R.layout.main) TabHelper.createInstance(this).apply { setUp() newTab("photos") .setText(R.string.tab_photos) .also { photosTab -> addTab(photosTab) } newTab("videos") .setText(R.string.tab_videos) .also { videosTab -> addTab(videosTab) } } }
Java
@Override public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.main); TabHelper tabHelper = TabHelper.createInstance(this); tabHelper.setUp(); CompatTab photosTab = tabHelper .newTab("photos") .setText(R.string.tab_photos); tabHelper.addTab(photosTab); CompatTab videosTab = tabHelper .newTab("videos") .setText(R.string.tab_videos); tabHelper.addTab(videosTab); }
Wenn Sie die Anwendung ausführen, wird mit diesem Code das richtige Aktivitätslayout aufgebläht und entweder ein TabHelperHoneycomb- oder ein TabHelperEclair-Objekt instanziiert. Die konkrete Klasse, die tatsächlich verwendet wird, ist für die Aktivität undurchsichtig, da sie die gemeinsame TabHelper-Schnittstelle verwenden.
Es folgen zwei Screenshots, die diese Implementierung auf einem Android 2.3- und einem Android 4.0-Gerät zeigen.
Abbildung 1 : Beispiel-Screenshots von abwärtskompatiblen Tabs, die auf einem Android 2.3-Gerät (TabHelperEclair) und einem Android 4.0-Gerät (TabHelperHoneycomb) ausgeführt werden.