如何在Android SDK中向后兼容新功能?
问题描述:
我想使用SDK 11中包含的操作栏功能。但是我也希望应用程序能够在SDK 10(2.3.3)的早期设备上运行。我愿意放弃早期设备的操作栏功能,因为它不是一项重要功能。我已经完成了关于反射,包装类和其他技术的所有阅读。我现在难以确定如何完成这项工作。我正在使用Eclipse。如何在Android SDK中向后兼容新功能?
如果我不设置Eclipse中的目标SDK 11或更高,那么任何地方,我都动作条的引用给出一个编译错误。如果我将目标设置为sdk 11或更高,它将编译,但不会显示它可以在早期设备上运行。我一直在设置android:minSdkVersion=10
。
能有人给我如何作出actionBar
引用,但得到它的目标之前的SDK级别的一些见解?提前致谢。
答
是的!你绝对可以做到这一点。尝试遵循下面列出的模式。
在你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版本的 操作栏的应用程序。
玩得开心!
上一般的向后兼容性的更多文档,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
好的,我做了一些类似的编码。我也会尝试你的建议。然后我发现的问题是,当我试图运行应用程序和模拟器(在eclipse中)时,只出现了目标级别的设备。我最终使用AVD管理器来启动较低级别的设备,然后在运行时专门使用它。我选择不使用ActionBarSherlock,因为我现在只想在新设备中使用该功能。我稍后可能会改变主意。谢谢。 – 2012-03-07 17:30:11
在AndroidManifest.xml中更改构建目标和最小版本后,可能需要告诉Eclipse构建目标已更改。为此,您可以右键单击您的项目并选择“属性”。然后选择左侧菜单中的“Android”,并确保选中的目标等于清单中指定的目标。所有这些都会更新项目根目录中的'project.properties'构建文件。 – twaddington 2012-03-07 18:45:00