В этом уроке показано, как создавать подклассы абстрактных классов CompatTab и TabHelper и использовать новые API. Ваше приложение сможет использовать эту реализацию на устройствах, работающих под управлением версии платформы, которая их поддерживает.
Внедрите вкладки, используя новые API.
Конкретные классы CompatTab и TabHelper , использующие новые API, представляют собой прокси- реализацию. Поскольку абстрактные классы, определенные в предыдущем уроке, отражают новые API (структура класса, сигнатуры методов и т. д.), конкретные классы, использующие эти новые API, проксируют вызовы методов и их результаты.
Благодаря отложенной загрузке классов вы можете напрямую использовать более новые API в этих конкретных классах — и это не приведет к сбоям на более ранних устройствах. Классы загружаются и инициализируются при первом обращении — создании экземпляра класса или первом обращении к одному из его статических полей или методов. Таким образом, пока вы не создадите экземпляры реализаций, специфичных для Honeycomb, на устройствах, предшествующих Honeycomb, виртуальная машина Dalvik не будет выдавать никаких исключений VerifyError .
Хорошим соглашением об именовании для этой реализации является добавление кода уровня API или версии платформы, соответствующего API, необходимым для конкретных классов. Например, реализация нативных вкладок может быть предоставлена классами CompatTabHoneycomb и TabHelperHoneycomb , поскольку они используют API, доступные в Android 3.0 (уровень API 11) или более поздних версиях.

Реализовать CompatTabHoneycomb
CompatTabHoneycomb — это реализация абстрактного класса CompatTab , который TabHelperHoneycomb использует для ссылки на отдельные вкладки. CompatTabHoneycomb перенаправляет все вызовы методов на содержащийся в нем объект ActionBar.Tab .
Начните внедрение CompatTabHoneycomb , используя новые API ActionBar.Tab :
Котлин
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
TabHelperHoneycomb — это реализация абстрактного класса TabHelper , которая перенаправляет вызовы методов к фактической ActionBar , полученной из содержащейся в ней Activity .
Реализуйте TabHelperHoneycomb , перенаправляя вызовы методов к API ActionBar :
Котлин
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. }