如何在 Android SDK 中编写向后兼容的新功能?

我想使用 SDK 11 中包含的操作栏功能.但是,我还希望该应用能够在 SDK 10 (2.3.3) 的早期设备上运行.我愿意放弃早期设备的操作栏功能,因为它不是一个重要的功能.我已经阅读了有关反射、包装类和其他一些技术的所有内容.我现在对如何完成这项工作感到困惑.我正在使用 Eclipse.

I want to use the actionbar feature included in SDK 11. However I also want the app to run on earlier devices from SDK 10 (2.3.3). I am willing to give up the actionbar feature for the earlier devices as it is not an important feature. I have done all the reading about reflection, wrapper class and some other techniques. I am now stumped on exactly how to make this work. I am using Eclipse.

如果我没有将 Eclipse 中的目标设置为 sdk 11 或更高版本,那么我引用 actionBar 的任何地方都会出现编译错误.如果我将目标设置为 sdk 11 或更高版本,它会编译但不会显示它可以在早期设备上运行.我一直设置 android:minSdkVersion=10.

If I don't set the target in Eclipse to sdk 11 or greater, then any place I have a reference to actionBar gives a compile error. If I put the target to sdk 11 or greater it compiles but won't show that it can run on earlier devices. I have android:minSdkVersion=10 set all the time.

有人能给我一些关于如何引用 actionBar 并让它针对以前的 sdk 级别的见解吗?提前致谢.

Can someone give me some insight on how to make the references to actionBar and yet get it to target a previous sdk level? Thanks in advance.

推荐答案

是的!你绝对可以做到这一点.尝试遵循下面概述的模式.

Yes! You can definitely do this. Try following the pattern outlined below.

在您的 AndroidManifest.xml 文件中声明以下内容(将平台版本替换为您的应用所需的任何版本):

In your AndroidManifest.xml file declare the following (replacing the platform versions with whatever your app requires):

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

通过针对 API 11 或更高版本的平台版本,您允许 Eclipse 链接(编译)本机 ActionBar 类.提供较早的最低平台版本可让您的应用在较早版本的 Android 上安装(运行).

By targeting a platform version of API 11 or higher, you are allowing Eclipse to link (compile) against the native ActionBar classes. Providing an earlier minimum platform version allows your app to be installed (run) on older versions of Android.

您的活动代码应如下所示:

Your Activity code should then look something like this:

@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 的当前版本:

Where the CompatibilityManager.java class simply provides static helper methods for determining the current version of the 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 库,它提供了一个兼容的 ActionBar API,可以追溯到 Android 2.x:

You might also consider leveraging the ActionBarSherlock library, which provides a compatible ActionBar API all the way back to Android 2.x:

库将自动使用本机操作栏可用或将自动包装自定义实现你的布局.这使您可以轻松地开发具有回溯至 2.x 的每个 Android 版本的操作栏.

The library will automatically use the native action bar when available or will automatically wrap a custom implementation around your layouts. This allows you to easily develop an application with an action bar for every version of Android back through 2.x.

玩得开心!

相关文章