抽象新的 API

假设您想在应用中使用 操作栏选项卡 作为顶层导航的主要形式。不幸的是,ActionBar API 仅在 Android 3.0 或更高版本(API 级别 11+)中可用。因此,如果您想将应用分发到运行较早平台版本的设备,则需要提供支持新 API 的实现,同时提供使用旧 API 的回退机制。

在本课程中,您将构建一个使用抽象类和特定于版本的实现的选项卡用户界面 (UI) 组件,以提供向后兼容性。本课程介绍如何为新的选项卡 API 创建抽象层,作为构建选项卡组件的第一步。

准备抽象

Java 编程语言中的 抽象 包括创建一个或多个接口或抽象类以隐藏实现细节。对于更新的 Android API,您可以使用抽象来构建版本感知组件,这些组件在较新设备上使用当前 API,并在较旧设备上回退到较旧、更兼容的 API。

使用这种方法时,您首先确定要以向后兼容方式使用的更新类,然后根据更新类的公共接口创建抽象类。在定义抽象接口时,您应该尽可能地镜像更新 API。这最大限度地提高了前向兼容性,并使将来在不再需要时更容易删除抽象层。

创建这些新 API 的抽象类后,可以创建任意数量的实现并在运行时进行选择。为了实现向后兼容性,这些实现可能会因所需的 API 级别而异。因此,一种实现可以使用最近发布的 API,而其他实现可以使用旧 API。

创建抽象选项卡接口

为了创建选项卡的向后兼容版本,您应该首先确定应用需要哪些功能和特定 API。在顶层部分选项卡的情况下,假设您具有以下功能要求

  1. 选项卡指示器应该显示文本和图标。
  2. 选项卡可以与片段实例相关联。
  3. 活动应该能够监听选项卡更改。

提前准备这些要求可以帮助您控制抽象层的范围。这意味着您可以花更少的时间创建抽象层的多个实现,并更快地开始使用新的向后兼容实现。

选项卡的关键 API 在 ActionBarActionBar.Tab 中。这些是要抽象的 API,以使您的选项卡对版本敏感。此示例项目的需要要求与 Eclair(API 级别 5)兼容,同时利用 Honeycomb(API 级别 11)中的新选项卡功能。下图显示了支持这两个实现及其抽象基类(或接口)的类结构图。

Class diagram of abstract base classes and version-specific implementations.

图 1. 抽象基类和特定于版本的实现的类图。

抽象 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);

    ...
}

在接下来的课程中,您将创建 TabHelperCompatTab 的实现,这些实现可以在旧版和新版平台上使用。

您还应该阅读