抽象新的 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 创建实现,这些实现可在旧版和新版平台版本上运行。

您还应该阅读