【问题标题】:How to code backward compatible new feature in Android SDK?如何在 Android SDK 中编写向后兼容的新功能?
【发布时间】:2012-03-22 10:51:02
【问题描述】:

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

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

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

【问题讨论】:

    标签: android eclipse sdk backwards-compatibility android-actionbar


    【解决方案1】:

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

    在您的 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 库,它提供了一个兼容的ActionBar API,一直到Android 2.x:

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

    玩得开心!

    【讨论】:

    • 更多关于一般向后兼容性的文档可以在developer.android.com/resources/articles/…找到。操作栏文档也涵盖了这一点,以及如何以基本形式使用它并且仍然向后兼容。 developer.android.com/guide/topics/ui/actionbar.html#Adding
    • 好的,我做了一些类似的编码。我也会尝试你的建议。然后我发现的问题是,当我尝试运行应用程序并且模拟器(在 eclipse 中)出现时,只出现了目标级别的设备。我最终使用 AVD 管理器来启动较低级别的设备,然后在它运行时专门使用它。我选择不使用 ActionBarSherlock,因为我现在只想要新设备中的功能。我以后可能会改变主意。谢谢。
    • 在 AndroidManifest.xml 中更改构建目标和最低版本后,您可能需要告诉 Eclipse 构建目标已更改。为此,您可以右键单击您的项目并选择Properties。然后在左侧菜单中选择Android 并确保选中的目标等于清单中指定的目标。所做的只是更新项目根目录中的project.properties 构建文件。
    • “通过针对 API 11 或更高版本的平台版本,您允许 Eclipse 链接(编译)与本机 ActionBar 类。” -- 并不是说​​这与&lt;uses-sdk&gt; 元素无关。
    猜你喜欢
    • 2017-10-13
    • 2012-08-23
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    相关资源
    最近更新 更多