2012-03-04 109 views
11

我想使用SDK 11中包含的操作欄功能。但是我也希望應用程序能夠在SDK 10(2.3.3)的早期設備上運行。我願意放棄早期設備的操作欄功能,因爲它不是一項重要功能。我已經完成了關於反射,包裝類和其他技術的所有閱讀。我現在難以確定如何完成這項工作。我正在使用Eclipse。如何在Android SDK中向後兼容新功能?

如果我不設置Eclipse中的目標SDK 11或更高,那麼任何地方,我都動作條的引用給出一個編譯錯誤。如果我將目標設置爲sdk 11或更高,它將編譯,但不會顯示它可以在早期設備上運行。我一直在設置android:minSdkVersion=10

能有人給我如何作出actionBar引用,但得到它的目標之前的SDK級別的一些見解?提前致謝。

回答

18

是的!你絕對可以做到這一點。嘗試遵循下面列出的模式。

在你AndroidManifest.xml文件中聲明如下(替換與任何您的應用要求平臺版本):

<!-- Build Target --> 
<uses-sdk android:targetSdkVersion="14" android:minSdkVersion="7" /> 

通過針對API 11或更高的平臺版本,您允許Eclipse的鏈接(編譯)針對本機ActionBar類。提供較早的最低平臺版本,可以在舊版Android上安裝(運行)您的應用。

你的活動代碼應該再是這個樣子:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (CompatibilityManager.isHoneycomb()) { 
     final ActionBar actionBar = getActionBar(); 
     actionBar.setDisplayShowHomeEnabled(true); 
     // ... 
    } else { 
     // The ActionBar is unavailable! 
     // ... 
    } 
} 

CompatibilityManager.java類簡單地規定:確定該SDK的當前版本的靜態輔助方法:

public class CompatibilityManager { 
    public static final String KINDLE_FIRE_MODEL = "Kindle Fire"; 

    /** 
    * Get the current Android API level. 
    */ 
    public static int getSdkVersion() { 
     return android.os.Build.VERSION.SDK_INT; 
    } 

    /** 
    * Determine if the device is running API level 11 or higher. 
    */ 
    public static boolean isHoneycomb() { 
     return getSdkVersion() >= Build.VERSION_CODES.HONEYCOMB; 
    } 

    /** 
    * Determine if the device is running API level 14 or higher. 
    */ 
    public static boolean isIceCreamSandwich() { 
     return getSdkVersion() >= Build.VERSION_CODES.ICE_CREAM_SANDWICH; 
    } 

    /** 
    * Determine if the current device is a first generation Kindle Fire. 
    * @return true if the device model is equal to "Kindle Fire", false if otherwise. 
    */ 
    public static boolean isKindleFire() { 
     return Build.MODEL.equals(KINDLE_FIRE_MODEL); 
    } 
} 

您也可以考慮借力ActionBarSherlock庫,它提供了一個兼容的API的ActionBar一路回至Android 2.X:

該庫將自動使用本機的操作欄時 提供或將自動環繞 自定義實現您的佈局。這使您可以通過2.x輕鬆開發每個Android版本的 操作欄的應用程序。

玩得開心!

+1

上一般的向後兼容性的更多文檔,http://developer.android.com/resources/articles/backward-compatibility.html找到操作欄文檔覆蓋這個問題,以及,和如何在基本形式使用它並且仍然向後兼容。 http://developer.android.com/guide/topics/ui/actionbar.html#Adding – cistearns 2012-03-06 07:46:15

+0

好的,我做了一些類似的編碼。我也會嘗試你的建議。然後我發現的問題是,當我試圖運行應用程序和模擬器(在eclipse中)時,只出現了目標級別的設備。我最終使用AVD管理器來啓動較低級別的設備,然後在運行時專門使用它。我選擇不使用ActionBarSherlock,因爲我現在只想在新設備中使用該功能。我稍後可能會改變主意。謝謝。 – 2012-03-07 17:30:11

+2

在AndroidManifest.xml中更改構建目標和最小版本後,可能需要告訴Eclipse構建目標已更改。爲此,您可以右鍵單擊您的項目並選擇「屬性」。然後選擇左側菜單中的「Android」,並確保選中的目標等於清單中指定的目標。所有這些都會更新項目根目錄中的'project.properties'構建文件。 – twaddington 2012-03-07 18:45:00