編寫: spencer198711 - 原文:http://developer.android.com/training/backward-compatible-ui/new-implementation.html
這一課展示了如何編寫CompatTab和TabHelper等抽象類的子類,并且使用了較新的APIs。你的應(yīng)用可以在支持這些新的APIs的平臺版本的設(shè)備上使用這種實現(xiàn)方式。
CompatTab和TabHelper抽象類的具體子類是一種代理實現(xiàn),它們使用了使用較新的APIs。由于抽象類在之前的課程中定義并且是對新APIs接口(類結(jié)構(gòu)、方法簽名等等)的鏡像,使用新APIs的具體子類只是簡單的代理方法調(diào)用和方法調(diào)用的結(jié)果。
你可以在這些具體子類中直接使用較新的APIs,由于使用延遲類加載的方式,在早期版本的設(shè)備上并不會發(fā)生崩潰現(xiàn)象。這些類在首次次被訪問(實例化類對象或者訪問類的靜態(tài)屬性或靜態(tài)方法)的時候才會去加載并初始化。因此,只要你不在Honeycomb之前的設(shè)備上實例化Honeycomb相關(guān)的實現(xiàn),dalvik虛擬機都不會拋出VerifyError異常。
對于本實現(xiàn),一個比較好的命名約定是把具體子類需要的API等級或者版本名字附加在APIs接口的后邊。例如,本地tab實現(xiàn)可以由CompatTabHoneycomb和abHelperHoneycomb這兩個類提供,名字后面附加Honeycomb是由于它們都依賴于Android 3.0(API等級11)之后版本的APIs。
http://wiki.jikexueyuan.com/project/android-training-geek/images/backward-compatible-ui-classes-honeycomb.png" alt="backward-compatible-ui-classes-honeycomb" />
CompatTabHoneycomb是CompatTab抽象類的具體實現(xiàn)并用來引用單獨的tabs。CompatTabHoneycomb只是簡單的代理ActionBar.Tab對象的方法調(diào)用。
開始使用ActionBar.Tab的APIs實現(xiàn)CompatTabHoneycomb:
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是TabHelper抽象類的具體實現(xiàn),TabHelperHoneycomb代理方法調(diào)用到ActionBar對象,而這個ActionBar對象是從包含他的Activity中獲取的。
實現(xiàn)TabHelperHoneycomb,代理其方法調(diào)用到ActionBar的API:
public class TabHelperHoneycomb extends TabHelper {
ActionBar mActionBar;
...
protected void setUp() {
if (mActionBar == null) {
mActionBar = mActivity.getActionBar();
mActionBar.setNavigationMode(
ActionBar.NAVIGATION_MODE_TABS);
}
}
public void addTab(CompatTab tab) {
...
// Tab is a CompatTabHoneycomb instance, so its
// native tab object is an ActionBar.Tab.
mActionBar.addTab((ActionBar.Tab) tab.getTab());
}
// The other important method, newTab() is part of
// the base implementation.
}