In dieser Lektion wird beschrieben, wie Sie eine Implementierung erstellen, die neuere APIs widerspiegelt, aber ältere Geräte unterstützt.
Ersatzlösung auswählen
Die größte Herausforderung bei der abwärtskompatiblen Verwendung neuerer UI-Funktionen besteht darin, eine ältere (Fallback-)Lösung für ältere Plattformversionen auszuwählen und zu implementieren. In vielen Fällen ist es möglich, den Zweck dieser neueren UI-Komponenten mit älteren UI-Framework-Funktionen zu erfüllen. Beispiel:
-
Aktionsleisten können mit einem horizontalen
LinearLayoutmit Bildschaltflächen implementiert werden, entweder als benutzerdefinierte Titelleisten oder als Ansichten in Ihrem Aktivitätslayout. Überlaufaktionen können unter der Schaltfläche Menü des Geräts angezeigt werden. -
Aktionsleisten-Tabs können mit einem horizontalen
LinearLayoutmit Schaltflächen oder mit dem UI-ElementTabWidgetimplementiert werden. -
NumberPicker- undSwitch-Widgets können mitSpinner- bzw.ToggleButton-Widgets implementiert werden. -
ListPopupWindow- undPopupMenu-Widgets können mitPopupWindow-Widgets implementiert werden.
Es gibt keine einheitliche Lösung für das Backporting neuerer UI-Komponenten auf ältere Geräte. Achten Sie auf die Nutzerfreundlichkeit: Auf älteren Geräten sind Nutzer möglicherweise nicht mit neueren Designmustern und UI-Komponenten vertraut. Überlegen Sie, wie dieselbe Funktionalität mit vertrauten Elementen bereitgestellt werden kann. In vielen Fällen ist dies weniger ein Problem, wenn neuere UI-Komponenten im Anwendungs-Ökosystem eine wichtige Rolle spielen (z. B. die Aktionsleiste) oder wenn das Interaktionsmodell einfach und intuitiv ist (z. B. Swipe-Ansichten mit einem ViewPager).
Tabs mit älteren APIs implementieren
Wenn Sie eine ältere Implementierung von Aktionsleisten-Tabs erstellen möchten, können Sie ein TabWidget und TabHost verwenden. Alternativ können Sie auch horizontal angeordnete Button-Widgets verwenden. Implementieren Sie dies in Klassen namens TabHelperEclair und CompatTabEclair, da diese Implementierung APIs verwendet, die spätestens in Android 2.0 (Eclair) eingeführt wurden.
Die CompatTabEclair-Implementierung speichert Tab-Eigenschaften wie den Tab-Text und das Symbol in Instanzvariablen, da kein ActionBar.Tab-Objekt zur Verfügung steht, um diese Speicherung zu verarbeiten:
Kotlin
class CompatTabEclair internal constructor(val activity: FragmentActivity, tag: String) : CompatTab(tag) { // Store these properties in the instance, // as there is no ActionBar.Tab object. private var text: CharSequence? = null ... override fun setText(resId: Int): CompatTab { // Our older implementation simply stores this // information in the object instance. text = activity.resources.getText(resId) return this } ... // Do the same for other properties (icon, callback, etc.) }
Java
public class CompatTabEclair extends CompatTab { // Store these properties in the instance, // as there is no ActionBar.Tab object. private CharSequence text; ... public CompatTab setText(int resId) { // Our older implementation simply stores this // information in the object instance. text = activity.getResources().getText(resId); return this; } ... // Do the same for other properties (icon, callback, etc.) }
Die TabHelperEclair Implementierung verwendet Methoden für das
TabHost Widget, um TabHost.TabSpec
Objekte und Tab-Indikatoren zu erstellen:
Kotlin
class TabHelperEclair internal constructor(activity: FragmentActivity) : TabHelper(activity) { private var tabHost: TabHost? = null ... override fun setUp() { // Our activity layout for pre-Honeycomb devices // must contain a TabHost. tabHost = tabHost ?: mActivity.findViewById<TabHost>(android.R.id.tabhost).apply { setup() } } override fun addTab(tab: CompatTab) { ... tabHost?.newTabSpec(tab.tag)?.run { setIndicator(tab.getText()) // And optional icon ... tabHost?.addTab(this) } } // The other important method, newTab() is part of // the base implementation. }
Java
public class TabHelperEclair extends TabHelper { private TabHost tabHost; ... protected void setUp() { if (tabHost == null) { // Our activity layout for pre-Honeycomb devices // must contain a TabHost. tabHost = (TabHost) mActivity.findViewById( android.R.id.tabhost); tabHost.setup(); } } public void addTab(CompatTab tab) { ... TabSpec spec = tabHost .newTabSpec(tag) .setIndicator(tab.getText()); // And optional icon ... tabHost.addTab(spec); } // The other important method, newTab() is part of // the base implementation. }
Sie haben jetzt zwei Implementierungen von CompatTab und TabHelper: eine, die auf Geräten mit Android 3.0 oder höher funktioniert und neue APIs verwendet, und eine andere, die auf Geräten mit Android 2.0 oder höher funktioniert und ältere APIs verwendet. In der nächsten Lektion wird beschrieben, wie Sie diese Implementierungen in Ihrer Anwendung verwenden.