代理到新的 API

本课程将向您展示如何对 CompatTabTabHelper 抽象类进行子类化,以及如何使用新的 API。您的应用程序可以在运行支持这些 API 的平台版本的设备上使用此实现。

使用新的 API 实现选项卡

使用更新的 API 的 CompatTabTabHelper 的具体类是代理实现。由于上一课中定义的抽象类反映了新的 API(类结构、方法签名等),因此使用这些更新的 API 的具体类只是代理方法调用及其结果。

由于延迟类加载,您可以在这些具体类中直接使用更新的 API,并且不会在早期设备上崩溃。类在首次访问时加载并初始化——首次实例化类或访问其静态字段或方法。因此,只要您不在预 Honeycomb 设备上实例化 Honeycomb 特定的实现,Dalvik VM 就不会抛出任何 VerifyError 异常。

此实现的一个好的命名约定是在 API 等级或平台版本代号后附加具体类所需的 API。例如,本机选项卡实现可以由 CompatTabHoneycombTabHelperHoneycomb 类提供,因为它们依赖于 Android 3.0(API 级别 11)或更高版本中提供的 API。

Class diagram for the Honeycomb implementation of tabs.

图 1. 选项卡 Honeycomb 实现的类图。

实现 CompatTabHoneycomb

CompatTabHoneycombTabHelperHoneycomb 用于引用单个选项卡的 CompatTab 抽象类的实现。CompatTabHoneycomb 只是将其包含的 ActionBar.Tab 对象的所有方法调用都代理到其中。

使用新的 ActionBar.Tab API 开始实现 CompatTabHoneycomb

Kotlin

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

TabHelperHoneycombTabHelper 抽象类的实现,它将方法调用代理到实际的 ActionBar,该 ActionBar 从其包含的 Activity 中获取。

实现 TabHelperHoneycomb,将方法调用代理到 ActionBar API

Kotlin

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.
}

您还应该阅读