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