Android 抽象出新的APIs

2018-08-02 18:13 更新

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

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

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

為抽象做準(zhǔn)備

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

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

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

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

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

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

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

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

backward-compatible-ui-classes

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

Abstract ActionBar.Tab

通過(guò)創(chuàng)建一個(gè)代表tab的抽象類(lèi)來(lái)開(kāi)始著手構(gòu)建tab抽象層,這個(gè)類(lèi)是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();
    ...
}

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

抽象出Action Bar Tab的方法

下一步,定義一個(gè)能夠允許你往Activity中創(chuàng)建和添加tab抽象類(lèi),并定義類(lèi)似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);
    ...
}

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)