Android 抽象出新的APIs

2018-08-02 18:13 更新

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

假如你想使用Action Bar Tabs作為你的應(yīng)用的頂層導航的主要形式。不幸的是,ActionBar APIs只在Android 3.0(API等級11)之后才能使用。因此,如果你想要在運行之前版本的Android平臺的設(shè)備上分發(fā)你的應(yīng)用,你需要提供一個支持新的API的實現(xiàn),同時提供一個回退機制,使得能夠使用舊的APIs。

在本課程中,使用了具有面向特定版本實現(xiàn)的抽象類去構(gòu)建一個tab頁形式的用戶界面,并以此提供向后兼容性。這一課描述了如何為新的tab API創(chuàng)建一個抽象層,并以此作為構(gòu)建tab組件的第一步。

為抽象做準備

在Java編程語言中,抽象包含了創(chuàng)建一個或者多個接口或抽象類去隱藏具體的實現(xiàn)細節(jié)。在新版本的Android API的情況中,你可以使用抽象去構(gòu)建能感知版本的組件,這個組件會在新版本的設(shè)備上使用當前的APIs,當回退到老的設(shè)備上同時存在兼容的APIs。

當使用這種方法時,你首先需要決定哪些要使用的類需要提供向后兼容,然后去根據(jù)新類中的public接口去創(chuàng)建抽象類。在創(chuàng)建抽象接口的過程中,你應(yīng)該盡可能多的為新APIs創(chuàng)建鏡像。這會最大化前向兼容性,使得在將來當這些接口不再需要的時候,廢棄這些接口會更加容易。

在為新的APIs創(chuàng)建抽象類之后,任何數(shù)量的實現(xiàn)都可以在運行的過程中去創(chuàng)建和選擇使用哪種。出于后向兼容的目的,這些實現(xiàn)可以通過所需的API級別而有所變化。一個實現(xiàn)可能會使用最新發(fā)布的APIs,而其他的則會去使用比較老的APIs。

創(chuàng)建抽象的Tab接口

為了能夠創(chuàng)建一個向后兼容的tabs,你首先需要決定你的應(yīng)用需要哪些功能和哪些特定的APIs接口。在頂層分節(jié)tabs的情況下,假設(shè)你有以下功能需求:

  1. 顯示圖標和文本的Tab指示器
  2. Tabs可以跟一個Fragment實例向關(guān)聯(lián)
  3. Activity可以監(jiān)聽到Tab變化

提前準備這些需求能夠讓你控制抽象層的范圍。這意味著你可以花更少的時間去創(chuàng)建抽象層的多個具體實現(xiàn),并很快就能使用這些新的后向兼容的實現(xiàn)。

Tabs的關(guān)鍵APIs是ActionBarActionBar.Tab,為了能夠使得tab能夠感知Android版本,這些是需要抽象出來的APIs。這個示例項目的需求要求同Eclair(API等級5)保持一致性,同時能夠利用Honeycomb(API等級11)中新的tab功能。一張展示能夠支持這兩種實現(xiàn)的類結(jié)構(gòu)和它們的抽象父類的圖顯示如下:

backward-compatible-ui-classes

  • 圖1.抽象基類和版本相關(guān)的子類實現(xiàn)類結(jié)構(gòu)圖

Abstract ActionBar.Tab

通過創(chuàng)建一個代表tab的抽象類來開始著手構(gòu)建tab抽象層,這個類是Actionbar.Tab接口的鏡像:

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

在這里,為了簡化諸如tab對象和Activity的聯(lián)系(未在代碼片段中顯示)等公共的功能,你可以使用一個抽象類而不是去使用接口。

抽象出Action Bar Tab的方法

下一步,定義一個能夠允許你往Activity中創(chuàng)建和添加tab抽象類,并定義類似ActionBar.newTab())和ActionBar.addTab())的方法。

public abstract class TabHelper {
    ...
    public CompatTab newTab(String tag) {
        // This method is implemented in a later lesson.
    }
    public abstract void addTab(CompatTab tab);
    ...
}

在下一課程中,你將會創(chuàng)建TabHelper和CompatTab的實現(xiàn),它能夠在新舊不同的平臺版本上都能工作。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號