【问题标题】:Menu button and related API deprecated as of API 11 and higher - how to handle that?自 API 11 及更高版本起已弃用菜单按钮和相关 API - 如何处理?
【发布时间】:2012-05-11 05:37:29
【问题描述】:

我引用 SDK 文档:

“从 Android 3.0(API 级别 11)开始,Android 驱动的设备不再需要提供专用的菜单按钮。通过此更改,Android 应用应该摆脱对传统 6 项菜单面板的依赖,并而是提供一个操作栏来呈现常见的用户操作。”

更多: “如果您正在为 Android 2.3 或更低版本进行开发,用户可以通过按下菜单按钮来显示选项菜单面板。 在 Android 3.0 及更高版本上,选项菜单中的项目由操作栏显示为屏幕操作项目和溢出选项的组合。从 Android 3.0 开始,不推荐使用菜单按钮(某些设备没有),因此您应该迁移到使用操作栏来提供对操作和其他选项的访问。”

所以,如果我理解正确,在具有菜单按钮的 Android 3.0 或更高版本的设备上,弃用的代码仍然可以工作,而在 Android 3.0 或更高版本且没有菜单按钮的设备上,弃用的代码将不会工作。

出现 5 个问题:

  1. 这些兼容性问题能否通过 Android 兼容性库处理?
  2. 如果是,怎么做?
  3. 如果没有,是否有人列出了搭载 Android 3 及更高版本且没有菜单按钮的设备?
  4. 目前这些设备的市场份额有多高?
  5. 指定最大 SDK,将排除所有设备,无论它们是否有菜单按钮。有没有更好的方法来确保应用只安装在兼容的设备上?

【问题讨论】:

    标签: android menu deprecated


    【解决方案1】:

    这些兼容性问题可以通过Android处理吗 兼容性库?如果是,怎么做?

    将您的目标 API 设置为 11 或更高版本(建议您将其设置为最新的可用版本:因此,请将您的目标 API 设置为 15)。然后在您的应用程序中启用一个 ActionBar。过去通过菜单键显示的内容现在显示在 ActionBar 的溢出菜单中,或者如果您将每个操作的 "showIfRoom" 设置为 true,则在栏本身上显示为单独的操作。

    如果没有,是否有人拥有 Android 3 及更高版本的设备列表 没有菜单按钮?

    尝试编写特殊情况是错误的方法。在带有菜单按钮的设备上,它将与菜单按钮一起使用。在那些没有菜单按钮的地方,会有溢出菜单。 Android Developer Blog 上有一篇关于此的博文。

    目前这些设备的市场份额有多高?

    规模虽小,但正在成长。

    指定最大 SDK,将排除所有设备,无论它们是否有菜单按钮。有没有更好的方法来确保应用只安装在兼容的设备上?

    是的:我描述的方法可以处理这两种情况,并且适用于所有设备:) 没有理由使用 maxSdk。

    编辑:解决 cmets 的问题:

    那么,如果我的目标是 8,那么具有 11 的设备将无法正确处理菜单按钮?

    如果您将目标设置为小于 11,则没有菜单键的设备将在其他软按钮旁边有一个“旧版”菜单按钮,如下所示:http://android-developers.blogspot.com/2012/01/say-goodbye-to-menu-button.html

    另一方面,如果我将目标设置为 11,如果我使用 > 8 的功能,eclipse 不会警告我?

    如果您将目标设置为 11 并将最小设置为 8,如果您使用 9 个以上的功能,Eclipse 将不会警告您 - 您需要为此测试您的应用程序。简单的方法:将你的目标 SDK 暂时移回 8,看看编译器在哪里对你大喊大叫,确保这些代码路径永远不会在无法处理它们的设备上受到影响。

    它对在 Google Play Market 上的分发有什么影响?

    只有好的。如果您设置 Max SDK,随着时间的推移,您的应用程序将与越来越少的设备兼容。最低版本为 8(而不是完全放弃向后兼容性)意味着您的应用程序可以安装在 Froyo 和 Gingerbread 设备上,而不仅仅是 Honeycomb 及更高版本。

    【讨论】:

    • 那么,如果我的目标是 8,那么 11 的设备将无法正确处理菜单按钮?另一方面,如果我将 target 设置为 11,如果我使用 features > 8,eclipse 不会警告我?此外,它对通过 android 市场进行分发有什么影响?
    • 我明显反对处理特殊情况。我编写了 web 服务器应用程序 b4 并避免为不同的浏览器而努力,以避免维护噩梦,结果证明这始终是一个明智的决定。
    【解决方案2】:

    这些兼容性问题可以通过Android兼容库处理吗?

    没有。

    如果没有,有没有人有 Android 3 或更高版本且没有菜单按钮的设备列表?

    几乎所有这些。运行 Android 2.x 并升级到 Android 4.x 的设备将有一个专用的 MENU 按钮(例如 Nexus S)。为 Android 3.0+ 构建的新设备很少有专用的 MENU 按钮。

    目前这些设备的市场份额有多高?

    截至 5 月初,Android 3.0+ 代表 8.2% of the devices accessing the Google Play Store。其中大部分是缺少 MENU 按钮的设备。

    有没有更好的方法来确保应用只安装在兼容的设备上?

    兼容性问题的唯一原因是您依赖 MENU 按钮来执行除显示选项菜单之外的操作。只需重写该代码以不再依赖 MENU 按钮,兼容性问题就会消失。

    【讨论】:

    • 我正在使用菜单按钮来执行菜单按钮的用途:显示菜单,仅此而已。不再依赖菜单按钮是什么意思?我将把菜单项放在哪里?对于 90% 以上确实有菜单按钮的设备的用户来说,这是一种易于理解的方式吗?
    • @mradlmaier:“我正在使用菜单按钮来执行菜单按钮的用途:显示菜单,仅此而已”——那么它仍然可以正常工作。请阅读android-developers.blogspot.com/2012/01/… 了解更多关于 MENU 按钮和操作栏的情况。
    • 我通读了。似乎很容易。我是否理解正确:我仍然可以拥有我的 onCreateOptionsMenu() 和 onPrepareOptionsMenu(),只在 menu.xml 中的一些菜单项中添加 showAsAction="ifRoom" 属性,将目标 SDK 更改为 15?
    • 唯一让我生气的是,我曾经在我拥有的少数 android 设备上进行测试,而不是模拟器(有时很糟糕)。现在,我还没有 ICS 设备,我现在不打算买一个 :(
    • 我应该澄清一下:我使用 onCreateOptionsMenu() 和 onPrepareOptionsMenu() 和 onOptionsItemSelected()。在 onPrepareOptionsMenu() 中,我根据活动禁用和隐藏 menu.xml 中的选项。仅此而已。
    【解决方案3】:

    您已弃用的代码将在没有菜单按钮的设备上运行。如果您的目标 SDK 低于 3.0,没有菜单按钮的设备将在屏幕底部显示一个软件菜单按钮。

    这在 Galaxy Nexus 和其他具有持久软件按钮的设备上看起来不错,但在 HTC One X 等通常没有软件按钮栏的设备上很难看。

    【讨论】:

      【解决方案4】:

      他们有一个在旧设备上使用操作栏的示例here。还可以根据 android 版本配置不同的布局和活动/方法,因此您可以在旧设备上使用普通菜单,在支持它的设备上使用操作栏。 (查看here如何在运行时检查平台,here根据平台使用不同的布局文件夹)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-15
        • 2021-03-29
        • 1970-01-01
        相关资源
        最近更新 更多