W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
編寫(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組件的第一步。
在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)建一個(gè)向后兼容的tabs,你首先需要決定你的應(yīng)用需要哪些功能和哪些特定的APIs接口。在頂層分節(jié)tabs的情況下,假設(shè)你有以下功能需求:
提前準(zhǔn)備這些需求能夠讓你控制抽象層的范圍。這意味著你可以花更少的時(shí)間去創(chuàng)建抽象層的多個(gè)具體實(shí)現(xiàn),并很快就能使用這些新的后向兼容的實(shí)現(xiàn)。
Tabs的關(guān)鍵APIs是ActionBar和ActionBar.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)的圖顯示如下:
通過(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)而不是去使用接口。
下一步,定義一個(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)版本上都能工作。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: