假設您想使用動作列分頁,做為應用程式中的主要頂層導覽形式。很抱歉,ActionBar API 僅適用於 Android 3.0 以上版本 (API 級別 11 以上)。因此,如要將應用程式發布至搭載舊版平台的裝置,您必須提供支援新版 API 的實作項目,同時提供使用舊版 API 的備援機制。
在本課程中,您將建構分頁式使用者介面 (UI) 元件,該元件會使用抽象類別和特定版本的實作項目,提供回溯相容性。本課程說明如何為新分頁 API 建立抽象層,這是建構分頁元件的第一步。
準備進行抽象化
在 Java 程式設計語言中,抽象化是指建立一或多個介面或抽象類別,以隱藏實作詳細資料。如果是較新的 Android API,您可以使用抽象化功能建構可感知版本的元件,在較新的裝置上使用目前的 API,並在較舊的裝置上回溯至較舊但相容性較高的 API。
使用這種方法時,您首先要決定要以回溯相容的方式使用哪些較新的類別,然後根據較新類別的公開介面建立抽象類別。定義抽象介面時,應盡可能反映較新的 API。這可確保最大程度的向前相容性,並在日後不再需要抽象層時,輕鬆捨棄該層。
為這些新 API 建立抽象類別後,您可以在執行階段建立及選擇任意數量的實作項目。為確保回溯相容性,這些實作方式可能會因所需的 API 級別而異。因此,一個實作項目可能會使用近期發布的 API,其他實作項目則可能使用舊版 API。
建立抽象分頁介面
如要建立可回溯相容的分頁版本,請先判斷應用程式需要哪些功能和特定 API。以頂層區段分頁標籤為例,假設您有下列功能需求:
- 分頁指標應會顯示文字和圖示。
- 分頁可以與片段例項建立關聯。
- 活動應能監聽分頁變更。
預先準備這些需求,有助於控管抽象層的範圍。也就是說,您不必花費大量時間建立抽象層的多個實作項目,可以更快開始使用新的回溯相容實作項目。
分頁的主要 API 位於 ActionBar 和 ActionBar.Tab。這些是您要抽象化的 API,才能讓分頁標籤瞭解版本。這個範例專案需要回溯相容至 Eclair (API 級別 5),同時善用 Honeycomb (API 級別 11) 的新分頁功能。下圖顯示支援這兩項實作項目及其抽象基底類別 (或介面) 的類別結構。

Abstract 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); ... }
在後續課程中,您將建立適用於舊版和新版平台的 TabHelper 和 CompatTab 實作項目。