0%

Android开发:创建向后兼容的UI--抽象新API

翻自http://developer.android.com/training/backward-compatible-ui/abstracting.html 假设你要在应用中使用Action Bar Tab作为主要的导航。不幸的是,ActionBar api只有Android 3.0以上版本才有(API Level 11+).因此,如果你想让应用运行在低版本的平台上,你需要提供新API的实现,同时提供旧API的回退机制。 本课中,你会构建一个标签式UI组件,使用特定版本实现的抽象类来提供向后兼容。这节课讲述了如何为新的标签API创建抽象实现层作为创建标签组件的第一步。 准备抽象 抽象在Java编程语言中包含了创建一个或多个接口或抽象类来隐藏具体实现。在新Android API的案例中,你可以使用抽象构建版本相关的组件,在新设备中使用当前的API,旧设备中回退到旧的,更兼容的api. 当使用这个方法,你首先确定用向后兼容的方式使用哪些新的类,然后创建抽象类,基于新类的public接口。在定义抽象接口时,你应该尽可能地复制新的api。这样做可以最大化向前兼容,并且在未来不需要它的时候,可以更容易的抛弃抽象层。 在为这些新api创建抽象类以后,可以创建任意数量的实现,并且在运行时选择。为了向后兼容的目的,这些实现可以根据api level不同而不同,因此,一个实现可以使用最新的api,其他的可以用旧的. 创建抽象Tab接口 为了创建向后兼容的tab,你应该先确定你的应用需要哪些特性和特别的api。在顶层选项标签中,假设你有以下功能需求: 标签指示器应该显示文本和图标 标签可以与fragment实例关联 activity应该可以监听标签改变 提前准备这些需求允许你控制抽象层的范围。这意味着你可以花更少的时间在创建多个抽象层实现上,更快使用向后兼容的实现。 标签的关键api在ActionBar和ActionBar.Tab里。为了让你的标签与版本相关,这些是需要抽象的api。案例项目中的需求需要Honeycomb(API Level 11)中的标签特性兼容到Eclair(API Level 5).类结构图和两个抽象基类实现如下: 抽象ActionBar.Tab 通过创建一个抽象类展示一个tab,复制ActionBar.Tab接口构建tab抽象层

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();
    ...
}

你可以使用一个抽象类代替接口,简化常用的特性(像把tab和activity关联)实现 抽象ActionBar Tab方法 下一步,定义一个允许你在Activity中创建和添加标签的抽象类,就像ActionBar.newTab()和ActionBar.addTab():

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实现