Android 代理至新的APIs

2018-08-02 18:14 更新

編寫: spencer198711 - 原文:http://developer.android.com/training/backward-compatible-ui/new-implementation.html

這一課展示了如何編寫CompatTab和TabHelper等抽象類的子類,并且使用了較新的APIs。你的應(yīng)用可以在支持這些新的APIs的平臺版本的設(shè)備上使用這種實現(xiàn)方式。

使用較新的APIs實現(xiàn)Tabs

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)可以由CompatTabHoneycombabHelperHoneycomb這兩個類提供,名字后面附加Honeycomb是由于它們都依賴于Android 3.0(API等級11)之后版本的APIs。

backward-compatible-ui-classes-honeycomb

  • 圖1. Honeycomb上tabs實現(xiàn)的類關(guān)系圖.

實現(xiàn)CompatTabHoneycomb

CompatTabHoneycombCompatTab抽象類的具體實現(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.)
}

實現(xiàn)TabHelperHoneycomb

TabHelperHoneycombTabHelper抽象類的具體實現(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.
}


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號