In dieser Lektion erfahren Sie, wie Sie Unterklassen für die abstrakten Klassen CompatTab
und TabHelper
erstellen und neue APIs verwenden. Deine App kann diese Implementierung auf Geräten verwenden, auf denen eine Plattformversion ausgeführt wird, die sie unterstützt.
Tabs mit neuen APIs implementieren
Die konkreten Klassen für CompatTab
und TabHelper
, die neuere APIs verwenden, sind eine Proxy-Implementierung. Da die in der vorherigen Lektion definierten abstrakten Klassen die neuen APIs (Klassenstruktur, Methodensignaturen usw.) widerspiegeln, leiten die konkreten Klassen, die diese neueren APIs verwenden, lediglich Methodenaufrufe und ihre Ergebnisse weiter.
Sie können neuere APIs in diesen konkreten Klassen direkt verwenden – und nicht auf älteren Geräten abstürzen – durch Lazy Class Loading. Klassen werden beim ersten Zugriff geladen und initialisiert, wodurch die Klasse instanziiert wird oder zum ersten Mal auf eines ihrer statischen Felder oder Methoden zugegriffen wird. Solange Sie keine Honeycomb-spezifischen Implementierungen auf Geräten vor Honeycomb instanziieren, löst die Dalvik-VM daher keine VerifyError
-Ausnahmen aus.
Eine gute Namenskonvention für diese Implementierung besteht darin, den Namen des API-Levels oder der Plattformversionscodename anzufügen, der den APIs entspricht, die für die konkreten Klassen erforderlich sind. Die Implementierung des nativen Tabs kann beispielsweise von den Klassen CompatTabHoneycomb
und TabHelperHoneycomb
bereitgestellt werden, da diese auf APIs basieren, die ab Android 3.0 (API-Level 11) verfügbar sind.
CompatTabHoneycomb implementieren
CompatTabHoneycomb
ist die Implementierung der abstrakten Klasse CompatTab
, mit der TabHelperHoneycomb
auf einzelne Tabs verweist. CompatTabHoneycomb
leitet einfach alle Methodenaufrufe an das enthaltene ActionBar.Tab
-Objekt weiter.
Implementieren Sie CompatTabHoneycomb
mithilfe der neuen ActionBar.Tab
APIs:
Kotlin
class CompatTabHoneycomb internal constructor(val activity: Activity, tag: String) : CompatTab(tag) { ... // The native tab object that this CompatTab acts as a proxy for. private var mTab: ActionBar.Tab = // Proxy to new ActionBar.newTab API activity.actionBar.newTab() override fun setText(@StringRes textId: Int): CompatTab { // Proxy to new ActionBar.Tab.setText API mTab.setText(textId) return this } ... // Do the same for other properties (icon, callback, etc.) }
Java
public class CompatTabHoneycomb extends CompatTab { // The native tab object that this CompatTab acts as a proxy for. ActionBar.Tab mTab; ... protected CompatTabHoneycomb(FragmentActivity activity, String tag) { ... // Proxy to new ActionBar.newTab API mTab = activity.getActionBar().newTab(); } public CompatTab setText(int resId) { // Proxy to new ActionBar.Tab.setText API mTab.setText(resId); return this; } ... // Do the same for other properties (icon, callback, etc.) }
TabHelperHoneycomb implementieren
TabHelperHoneycomb
ist die Implementierung der abstrakten TabHelper
-Klasse, die Methodenaufrufe an eine tatsächliche ActionBar
weiterleitet, die aus der enthaltenen Activity
abgerufen wird.
Implementieren Sie TabHelperHoneycomb
und leiten Sie Methodenaufrufe an die ActionBar
-API weiter:
Kotlin
class TabHelperHoneycomb internal constructor(activity: FragmentActivity) : TabHelper(activity) { private var mActionBar: ActionBar? = null override fun setUp() { mActionBar = mActionBar ?: mActivity.actionBar.apply { navigationMode = ActionBar.NAVIGATION_MODE_TABS } } override fun addTab(tab: CompatTab) { // Tab is a CompatTabHoneycomb instance, so its // native tab object is an ActionBar.Tab. mActionBar?.addTab(tab.getTab() as ActionBar.Tab) } }
Java
public class TabHelperHoneycomb extends TabHelper { ActionBar actionBar; ... protected void setUp() { if (actionBar == null) { actionBar = activity.getActionBar(); actionBar.setNavigationMode( ActionBar.NAVIGATION_MODE_TABS); } } public void addTab(CompatTab tab) { ... // Tab is a CompatTabHoneycomb instance, so its // native tab object is an ActionBar.Tab. actionBar.addTab((ActionBar.Tab) tab.getTab()); } // The other important method, newTab() is part of // the base implementation. }