课程内容

  1. 添加选择逻辑
  2. 创建一个版本感知的Activity Layout
  3. 在Activity中使用 TabHelper

动手试试

Download the sample app TabCompat.zip

这节内容介绍如何添加选择不同实现的逻辑以及如何在对应的版本中选择对应的实现方式,如何创建版本感知的布局。

添加选择逻辑

TabHelpe 抽象类作为factory工厂方法类来创建版本相关的TabHelper 和 CompatTab 实例。

public abstract class TabHelper {
...
// Usage is TabHelper.createInstance(activity)
public static TabHelper createInstance(FragmentActivity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
return new TabHelperHoneycomb(activity);
} else {
return new TabHelperEclair(activity);
}
}

// Usage is mTabHelper.newTab("tag")
public CompatTab newTab(String tag) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
return new CompatTabHoneycomb(mActivity, tag);
} else {
return new CompatTabEclair(mActivity, tag);
}
}
...
}

创建一个版本感知的Activity Layout

然后是创建一个支持两种tab实现的布局。对于旧的实现方式 (TabHelperEclair),布局中包含 TabWidget 和 TabHost,和一个包含tab的容器:

res/layout/main.xml:

<!-- This layout is for API level 5-10 only. -->

而对于 TabHelperHoneycomb 实现,需要使用 FrameLayout 作为tab的容器。

res/layout-v11/main.xml:

在程序运行的时候, Android会根据系统的版本来选择对应的 main.xml 布局文件。 和前面用来选择TabHelper 实现的逻辑是一样的。

在Activity中使用 TabHelper

在activity的 onCreate()函数中,创建一个TabHelper 对象:

@Override
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.main);

TabHelper tabHelper = TabHelper.createInstance(this);
tabHelper.setUp();

CompatTab photosTab = tabHelper.newTab("photos").setText(R.string.tab_photos);
tabHelper.addTab(photosTab);

CompatTab videosTab = tabHelper.newTab("videos").setText(R.string.tab_videos);
tabHelper.addTab(videosTab);
}

当运行程序的时候,系统选择正确的布局文件并实例化对应的 TabHelperHoneycomb 实现或者 TabHelperEclair实现。由于 TabHelper的存在,隔离了activity对每个实现的感知。

下面是运行在 Android 2.3 和 Android 4.0 中的截图。

backward-compatible-ui-gb
backward-compatible-ui-gb
backward-compatible-ui-ics
backward-compatible-ui-ics

原文:http://blog.chengyunfeng.com/?p=405