Z tej lekcji dowiesz się, jak utworzyć podklasę klas abstrakcyjnych CompatTab i TabHelper oraz jak korzystać z nowych interfejsów API. Twoja aplikacja może używać tej implementacji na urządzeniach z platformą w wersji, która ją obsługuje.
Implementowanie kart za pomocą nowych interfejsów API
Konkretne klasy CompatTab i TabHelper, które korzystają z nowszych interfejsów API, są implementacją proxy. Ponieważ klasy abstrakcyjne zdefiniowane w poprzedniej lekcji odzwierciedlają nowe interfejsy API (strukturę klas, sygnatury metod itp.), konkretne klasy, które korzystają z tych nowszych interfejsów API, przekazują wywołania metod i ich wyniki.
Dzięki leniwemu ładowaniu klas możesz bezpośrednio używać nowszych interfejsów API w tych konkretnych klasach i nie powodować awarii na starszych urządzeniach. Klasy są ładowane i inicjowane przy pierwszym dostępie – podczas tworzenia instancji klasy lub pierwszego dostępu do jednego z jej statycznych pól lub metod. Dlatego, dopóki nie utworzysz instancji implementacji specyficznych dla Honeycomb na urządzeniach z Androidem w wersji starszej niż Honeycomb, maszyna wirtualna Dalvik nie będzie zgłaszać żadnych wyjątków VerifyError.
Dobrym sposobem na nazwanie tej implementacji jest dodanie poziomu interfejsu API lub nazwy kodowej wersji platformy odpowiadającej interfejsom API wymaganym przez konkretne klasy. Na przykład natywną implementację kart można udostępnić za pomocą klas CompatTabHoneycomb i TabHelperHoneycomb, ponieważ korzystają one z interfejsów API dostępnych w Androidzie 3.0 (poziom interfejsu API 11) lub nowszym.
Implementowanie CompatTabHoneycomb
CompatTabHoneycomb to implementacja klasy abstrakcyjnej CompatTab, której TabHelperHoneycomb używa do odwoływania się do poszczególnych kart. CompatTabHoneycomb przekazuje wszystkie wywołania metod do zawartego w niej obiektu ActionBar.Tab.
Zacznij implementować CompatTabHoneycomb za pomocą nowych interfejsów API ActionBar.Tab:
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.) }
Implementowanie TabHelperHoneycomb
TabHelperHoneycomb to implementacja klasy abstrakcyjnej TabHelper, która przekazuje wywołania metod do rzeczywistego ActionBar uzyskanego z zawartego w niej Activity.
Zaimplementuj TabHelperHoneycomb, przekazując wywołania metod do interfejsu API ActionBar:
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. }