【问题标题】:How to show an options menu on Honeycomb without an action bar?如何在没有操作栏的情况下在 Honeycomb 上显示选项菜单?
【发布时间】:2012-12-20 05:44:50
【问题描述】:

如何在 Honeycomb 或 ICS 平板电脑上显示选项菜单,而没有操作栏?

经过一番尝试,如果没有操作栏且targetsdkversion >=11,似乎无法在 Honeycomb 设备上设置选项菜单。即使您的主题是Theme.Holo.NoActionBar。我可以看到在带有targetsdkversion>=11 的 Honeycomb 上显示选项菜单的唯一方法是使用确实有操作栏的主题,然后将其隐藏在 onCreate 中。 我能看到在 Honeycomb 上显示旧面板菜单的唯一方法是使用 targetsdkversion

总而言之,在 Honeycomb 中,如果您没有操作栏,就没有选项菜单,除非您的目标是 11 以下。这似乎像一个错误。在 ICS 及更高版本中,您可以 有任何你喜欢的选项菜单,不管你是否真的有一个操作栏。

我最初的目标是能够在 Honeycomb 及更高版本上使用旧样式的面板菜单和新的操作栏菜单(在不同的活动中),同时在 Honeycomb 下方的任何地方使用面板菜单。

原因是有一个 Activity 需要有大的菜单按钮,但应用程序的其余部分可以完美地全息化。

为了实现这一点,我在所有地方都使用了Theme.Holo(用于 api 11+),除了我使用Theme.NoTitlebar 的这一活动。我有android:minSdkVersion="5" android:targetSdkVersion="14",所以不显示支持菜单键(因此不会在一些新的 HTC 手机上浪费屏幕空间)。如果设备没有硬件菜单按钮,我提供自己的按钮来弹出面板菜单(通过 http://developer.android.com/reference/android/view/ViewConfiguration.html#hasPermanentMenuKey() )

问题是,这不适用于 Honeycomb 平板电脑(Galaxy Tab,Honeycomb 3.2)。带有操作栏的正常活动工作正常,但在特殊活动上,当我按下菜单按钮(我在 UI 中提供的那个)时没有任何反应。

这在至少 2 部 ICS 手机和模拟器上运行良好(有和没有硬件菜单键)。正常的操作栏菜单,除了在这个活动中,我得到大面板菜单。

那么解决方法是什么?这是 Galaxy Tab 还是 Honeycomb 的问题?我应该使用不同的主题来提供面板菜单吗?

编辑:我得到了一个 ICS 平板电脑进行更多测试,发现面板菜单也没有出现在那里。 因此,在相同版本的 Android 上,完全相同的应用程序将在手机上显示面板菜单,而在平板电脑上则不显示任何内容。嗯?

【问题讨论】:

    标签: android android-actionbar android-menu


    【解决方案1】:

    以下是 Honeycomb 及以上 Android 版本的 PhoneWindow 系统类的摘录。这是对 Android 目标版本和设备屏幕尺寸的硬编码检查。你能避免这个检查吗 - 菜单会正常显示。但不存在这种可能性。这就是为什么无法在目标 sdk 设置为 10 以上的 Honeycomb+ 设备上显示选项菜单的原因。有趣的是,如果可以显示操作栏菜单,它会更早显示,并且永远不会到达此代码。正因为如此,代码上面的注释看起来特别讽刺。

    // Don't open an options panel for honeycomb apps on xlarge devices.
    // (The app should be using an action bar for menu items.)
    if (st.featureId == FEATURE_OPTIONS_PANEL) {
        Context context = getContext();
        Configuration config = context.getResources().getConfiguration();
        boolean isXLarge = (config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) ==
                     Configuration.SCREENLAYOUT_SIZE_XLARGE;
        boolean isHoneycombApp = context.getApplicationInfo().targetSdkVersion >=
                android.os.Build.VERSION_CODES.HONEYCOMB;
    
        if (isXLarge && isHoneycombApp) {
            return;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 2019-08-04
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多