В этом уроке обсуждается, как создать реализацию, которая отражает новые API, но поддерживает старые устройства.
Выберите альтернативное решение
Самая сложная задача при использовании новых функций пользовательского интерфейса с обратной совместимостью – это выбор и реализация резервного решения для более старых версий платформы. Во многих случаях можно достичь тех же целей, что и при использовании новых компонентов интерфейса, с помощью более старых функций фреймворка. Пример:
-
Панели действий можно реализовать с помощью горизонтального макета
LinearLayout, содержащего кнопки с изображениями, в виде настраиваемых строк заголовка или представлений в макете действия. Дополнительные действия могут быть представлены под кнопкой Меню устройства. -
Вкладки панели действий можно реализовать с помощью горизонтального элемента
LinearLayout, содержащего кнопки, или с помощью элемента интерфейсаTabWidget. -
Виджеты
NumberPickerиSwitchможно реализовать с помощью виджетовSpinnerиToggleButtonсоответственно. -
Виджеты
ListPopupWindowиPopupMenuможно реализовать с помощью виджетовPopupWindow.
Универсального решения для переноса новых компонентов интерфейса на старые устройства не существует. Помните об удобстве для пользователей. На старых устройствах могут не поддерживаться новые шаблоны дизайна и компоненты интерфейса. Подумайте, как можно реализовать ту же функциональность с помощью привычных элементов. Во многих случаях это не так важно, если новые компоненты интерфейса (например, панель действий) занимают видное место в экосистеме приложения или если модель взаимодействия проста и интуитивно понятна (например, скользящие представления с использованием ViewPager).
Реализация вкладок с помощью старых API
Чтобы создать более старую реализацию вкладок панели действий, можно использовать TabWidget и TabHost (хотя в качестве альтернативы можно использовать горизонтально расположенные виджеты Button). Реализуйте это в классах TabHelperEclair и CompatTabEclair, поскольку в этой реализации используются API, представленные не позднее Android 2.0 (Eclair).
Реализация CompatTabEclair хранит свойства вкладок, такие как текст и значок, в переменных экземпляра, поскольку для этого нет доступного объекта ActionBar.Tab:
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.) }
В реализации TabHelperEclair используются методы виджета TabHost для создания объектов TabHost.TabSpec и индикаторов вкладок:
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. }
Теперь у вас есть две реализации CompatTab и TabHelper: одна работает на устройствах с Android 3.0 или более поздней версии и использует новые API, а другая работает на устройствах с Android 2.0 или более поздней версии и использует старые API. В следующем уроке мы обсудим, как использовать эти реализации в вашем приложении.