如何在没有操作栏的情况下在Honeycomb上显示选项菜单?

时间:2012-12-20 05:44:50

标签: android android-actionbar android-menu

如何在没有操作栏的情况下在Honeycomb或ICS平板电脑上显示选项菜单?

在玩了一些游戏之后,如果没有操作栏并且targetsdkversion是> = 11,似乎无法在Honeycomb设备上设置选项菜单。即使您的主题是Theme.Holo.NoActionBar。我可以看到在targetsdkversion> = 11的Honeycomb上显示选项菜单的唯一方法是使用一个带有操作栏的主题,然后将其隐藏在onCreate中。 我可以看到在Honeycomb上显示旧面板菜单的唯一方法是使用targetsdkversion< = 10。

总之,在Honeycomb中 ,如果你没有操作栏 ,就没有办法选择菜单,除非你的目标是11以下。这似乎像一个bug。在ICS及以上,你可以 有你喜欢的任何选项菜单,无论你是否真的有一个动作栏。

我最初的目标是能够在Honeycomb上使用旧样式面板菜单和新的Action Bar菜单(在不同的活动中),同时在Honeycomb下面的任何地方使用面板菜单。

原因是有一项活动需要有大型菜单按钮,但应用程序的其余部分可以完全Holo-ed。

为实现这一目标,除了我使用Theme.Holo的这一项活动之外,我已经使用了Theme.NoTitlebar(对于api 11+)。我有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上,将在手机上显示面板菜单,平板电脑上没有任何内容。咦?

1 个答案:

答案 0 :(得分:2)

以下是PhoneWindow系统类与Honeycomb及以上Android版本的摘录。这是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;
    }
}