假设您想在应用中使用 操作栏选项卡 作为顶层导航的主要形式。不幸的是,ActionBar
API 仅在 Android 3.0 或更高版本(API 级别 11+)中可用。因此,如果您想将应用分发到运行较早平台版本的设备,则需要提供支持新 API 的实现,同时提供使用旧 API 的回退机制。
在本课程中,您将构建一个使用抽象类和特定于版本的实现的选项卡用户界面 (UI) 组件,以提供向后兼容性。本课程介绍如何为新的选项卡 API 创建抽象层,作为构建选项卡组件的第一步。
准备抽象
Java 编程语言中的 抽象 包括创建一个或多个接口或抽象类以隐藏实现细节。对于更新的 Android API,您可以使用抽象来构建版本感知组件,这些组件在较新设备上使用当前 API,并在较旧设备上回退到较旧、更兼容的 API。
使用这种方法时,您首先确定要以向后兼容方式使用的更新类,然后根据更新类的公共接口创建抽象类。在定义抽象接口时,您应该尽可能地镜像更新 API。这最大限度地提高了前向兼容性,并使将来在不再需要时更容易删除抽象层。
创建这些新 API 的抽象类后,可以创建任意数量的实现并在运行时进行选择。为了实现向后兼容性,这些实现可能会因所需的 API 级别而异。因此,一种实现可以使用最近发布的 API,而其他实现可以使用旧 API。
创建抽象选项卡接口
为了创建选项卡的向后兼容版本,您应该首先确定应用需要哪些功能和特定 API。在顶层部分选项卡的情况下,假设您具有以下功能要求
- 选项卡指示器应该显示文本和图标。
- 选项卡可以与片段实例相关联。
- 活动应该能够监听选项卡更改。
提前准备这些要求可以帮助您控制抽象层的范围。这意味着您可以花更少的时间创建抽象层的多个实现,并更快地开始使用新的向后兼容实现。
选项卡的关键 API 在 ActionBar
和 ActionBar.Tab
中。这些是要抽象的 API,以使您的选项卡对版本敏感。此示例项目的需要要求与 Eclair(API 级别 5)兼容,同时利用 Honeycomb(API 级别 11)中的新选项卡功能。下图显示了支持这两个实现及其抽象基类(或接口)的类结构图。
抽象 ActionBar.Tab
通过创建一个抽象类来表示选项卡,该类镜像 ActionBar.Tab
接口,开始构建您的选项卡抽象层
Kotlin
sealed class CompatTab(val tag: String) { ... abstract fun getText(): CharSequence abstract fun getIcon(): Drawable abstract fun getCallback(): CompatTabListener abstract fun getFragment(): Fragment abstract fun setText(text: String): CompatTab abstract fun setIcon(icon: Drawable): CompatTab abstract fun setCallback(callback: CompatTabListener): CompatTab abstract fun setFragment(fragment: Fragment): CompatTab ... }
Java
public abstract class CompatTab { ... public abstract CompatTab setText(int resId); public abstract CompatTab setIcon(int resId); public abstract CompatTab setTabListener( CompatTabListener callback); public abstract CompatTab setFragment(Fragment fragment); public abstract CharSequence getText(); public abstract Drawable getIcon(); public abstract CompatTabListener getCallback(); public abstract Fragment getFragment(); ... }
您可以在此处使用抽象类而不是接口,以简化常见功能的实现,例如选项卡对象与活动之间的关联(代码片段中未显示)。
抽象 ActionBar 选项卡方法
接下来,定义一个抽象类,允许您创建选项卡并将其添加到活动,例如 ActionBar.newTab()
和 ActionBar.addTab()
Kotlin
sealed class TabHelper(protected val activity: FragmentActivity) { ... abstract fun setUp() fun newTab(tag: String): CompatTab { // This method is implemented in a later lesson. } abstract fun addTab(tab: CompatTab) ... }
Java
public abstract class TabHelper { ... public CompatTab newTab(String tag) { // This method is implemented in a later lesson. } public abstract void addTab(CompatTab tab); ... }
在接下来的课程中,您将创建 TabHelper
和 CompatTab
的实现,这些实现可以在旧版和新版平台上使用。