將新 API 抽象化

假設您想要使用動作列分頁做為應用程式內頂層導覽的主要形式,很抱歉,ActionBar API 僅適用於 Android 3.0 以上版本 (API 級別 11 以上版本)。因此,如果您想將應用程式發布到搭載舊版平台的裝置,就必須提供支援新版 API 的實作,同時提供使用舊版 API 的備用機制。

在此類別中,您會建構分頁式使用者介面 (UI) 元件,使用抽象類別搭配特定版本實作,提供回溯相容性。本課程說明如何為新分頁 API 建立抽象層,做為建構分頁元件的第一步。

準備抽象化作業

Java 程式設計語言中的抽象,涉及建立一或多個介面或抽象類別來隱藏實作詳細資料。以較新的 Android API 來說,您可以使用抽象層建構版本感知元件,在較新的裝置上使用目前 API,並在舊版裝置上改回使用較具相容性的舊版 API。

使用這個方法時,您必須先決定哪些較新的類別能以回溯相容的方式使用,然後根據較新類別的公開介面建立抽象類別。在定義抽象介面時,您應盡可能鏡射新版 API。這種做法可以提高前瞻相容性,並更輕鬆地在日後不再需要時捨棄抽象層。

為這些新的 API 建立抽象類別後,您可以在執行階段建立和選擇任意數量的實作。為了實現回溯相容性,這些實作可能會因所需的 API 級別而異。因此,其中一個實作項目可能會使用最近發布的 API,有些則使用舊版 API。

建立抽象分頁介面

為了建立具有回溯相容性的分頁版本,您必須先決定應用程式需要的功能和特定 API。如果是頂層專區分頁,則假設您具備下列功能需求:

  1. 分頁指標應顯示文字和圖示。
  2. 分頁可以與片段執行個體建立關聯。
  3. 該活動應能監聽分頁變更。

事先準備這些要求可讓您控管抽象層的範圍。如此一來,您就能減少建立多個抽象層實作作業的時間,更快開始使用具有回溯相容性的新實作。

分頁的主要 API 位於 ActionBarActionBar.Tab。這些 API 可讓您抽象化的分頁版本。這個範例專案的要求需要與 Eclair (API 級別 5) 相容,同時利用 Honeycomb (API 級別 11) 中的新分頁功能。下方顯示可支援這兩種實作及其抽象基本類別 (或介面) 的類別結構圖。

抽象基本類別和特定版本實作的類別圖表。

圖 1 抽象基本類別和特定版本實作的類別圖表。

抽象 ActionBar.Tab

建立代表分頁標籤的抽象類別,建立鏡射 ActionBar.Tab 介面,開始建構分頁抽象層:

Kotlin

sealed class CompatTab(val tag: String) {
    ...
    abstract fun getText(): CharSequence
    abstract fun getIcon(): Drawable
    abstract fun getCallback(): CompatTabListener
    abstract fun getFragment(): Fragment

    abstract fun setText(text: String): CompatTab
    abstract fun setIcon(icon: Drawable): CompatTab
    abstract fun setCallback(callback: CompatTabListener): CompatTab
    abstract fun setFragment(fragment: Fragment): CompatTab
    ...
}

Java

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

您可以使用抽象類別,而不要使用這裡的介面,以便簡化常見功能的實作程序,例如將分頁物件與活動建立關聯 (不會顯示在程式碼片段中)。

抽象 ActionBar 分頁方法

接著,定義一個抽象類別,讓您建立並新增分頁至活動,例如 ActionBar.newTab()ActionBar.addTab()

Kotlin

sealed class TabHelper(protected val activity: FragmentActivity) {
    ...

    abstract fun setUp()

    fun newTab(tag: String): CompatTab {
        // This method is implemented in a later lesson.
    }

    abstract fun addTab(tab: CompatTab)

    ...
}

Java

public abstract class TabHelper {
    ...

    public CompatTab newTab(String tag) {
        // This method is implemented in a later lesson.
    }

    public abstract void addTab(CompatTab tab);

    ...
}

在後續課程中,您將建立 TabHelperCompatTab 實作,同時支援舊版和較新版本。

另請參閱