【问题标题】:#ifdef in Android#ifdef 在 Android 中
【发布时间】:2012-03-16 19:50:14
【问题描述】:

我正在为 Android 编写一个应用程序。我的应用程序必须在 Android 2.2 和 Android 4.0.3 下启动,我想在 Android 中使用 #ifdef 之类的东西,但我仍然找不到这样做的方法。

代码示例

Android 4.0.3

if( android.os.Build.VERSION.SDK == 4.0.3)
{
    String str = "foo";
    boolean b = str.isEmpty();
}

安卓 2.2

else {
    String str = "foo";
    boolean b = str.length() == 0;
}

我不能写这样的代码,因为编译器会报错。

你可以建议我做什么?

【问题讨论】:

  • 您的问题可能与该问题重复:stackoverflow.com/questions/3506792/…
  • 具体要使用#ifdef 做什么?正如已删除的答案指出的那样,Java 中没有 #ifdef。因此,除非您具体解释您要完成的工作,否则任何人都很难给您建议。
  • 您的回答部分有帮助,例如在 Android 2.2 版中我不能调用 String str = "aaaa"; str.isEmpty(); 但在 Android 4.0.3 中我可以,所以如果我编写此代码,它会在 2.2 中给出错误,我能做什么这种情况下怎么办?
  • docs.oracle.com/javase/tutorial/java/nutsandbolts/if.html 。如果你不知道如何在 java 中使用条件语句。但是,我假设您这样做了,因此请详细说明您的问题。
  • 为什么是 -1 ?我的问题不正确?

标签: java android conditional-compilation


【解决方案1】:

你可以建议我做什么?

Java 新手在开始 Android 开发之前应该花时间学习 Java。 4.0.3 不是 Java 中的有效整数。

相反,您应该使用:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
 // do something
}

【讨论】:

  • Doh,打败我 - 投票删除我的答案(你可能会立即删除它)
  • @CommonsWare 所以你想说如果我写这样的东西if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) { String str = "foo"; boolean b = str.isEmpty(); } else { String str = "foo"; boolean b = str.length() == 0; } 这个代码在android 2.2和4.0.3中都可以工作
  • @ViToBrothersApoyan:嗯,我不知道有问题的代码有什么意义。但是,是的,这应该有效。请注意,isEmpty() 是在 API 级别 9 (Build.VERSION_CODES.GINGERBREAD) 中添加的。
  • 我认为这里的重点是使用在 API 级别 9 之前不存在的 String.isEmpty()。developer.android.com/reference/java/lang/String.html#isEmpty() 但我认为该示例不会起作用,因为该类不会由于缺少方法,因此能够在旧的 API 级别上加载。您可以在一个新类中提取新 API 级别的代码,您只需为该 API 级别加载该代码。 CommonsWare 在他的书中谈到了这一点。
【解决方案2】:

#ifdef 用于编译时处理,即使这在 Java 中是普遍接受的做法(不是,但确实存在支持该概念的 3rd 方工具),它不太可能对您有所帮助,因为您需要对您运行的环境做出运行时决策(除非您想生成多个包?)。

正如 fabricemarcelin 提供的链接 (http://stackoverflow.com/questions/3506792/android-api-version-programmatically) 所述,您可以轻松地确定运行时系统的版本。您需要将您的应用程序写入您知道将在运行时存在的 API(2.2 系统,如果这是您的下限),并且您需要做出关于调用 4.0 函数的运行时决定。对于 4.0 功能,您可能需要使用反射来查找 API。

我已经使用反射来访问其他仅在较新的 Android 系统上可用的东西,并且效果很好。一个提示是,如果合理,请安排在应用程序的早期执行反射/API 位置,如果不合理,至少安排每次调用只执行一次。

【讨论】:

    【解决方案3】:

    您可以简单地检查 Api Level 并调用 Build.VERSION.SDK_INT

    【讨论】:

    • Build.VERSION.SDK 已弃用 - 最好使用 SDK_INT developer.android.com/reference/android/os/…
    • 不用担心。人们喜欢抨击 Android 的 UI 碎片化,嗯!与 API 级别的更改和已弃用的 API 相比,这算不了什么 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2012-04-01
    • 2010-11-01
    • 2016-06-22
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多