【问题标题】:FEATURE_NO_TITLE also removes menuFEATURE_NO_TITLE 也会删除菜单
【发布时间】:2013-11-23 23:19:32
【问题描述】:

我创建了一个自定义菜单栏。没有什么复杂的只是一个包含六个 ImageButtons 的 LinearLayout,因为默认的 Android 标题菜单对我的应用程序来说太不一致了。不一致的意思是顶部显示的按钮数量因设备而异。 为了隐藏 android 标题栏,我在 styles.xml 中设置了以下内容

 <style name="AppTheme" parent="AppBaseTheme">
    <item name="android:windowNoTitle">true</item>
</style>

在我的 menu.xml 中,我还将“showAsAction”参数设置为“never”

   <item
    android:id="@+id/menu_settings"
    android:showAsAction="never"
    android:title="@string/my_menu_settings"/>

一切正常。我测试了我的应用程序: - 华硕变压器 tf300 - 三星盖乐世 Note 2 - 三星Galaxy S3 - Lg 擎天柱 4x 高清 P880 - 三星银河王牌 - 多个模拟器 - 还有更多...

但今天我在全新的 Sony Xperia Z1 上测试了我的应用程序。 问题在于,当我单击菜单按钮(三个默认的 android 按钮之一 -> 返回、主页和菜单)时,菜单不显示。 设备返回应用列表。没有打开菜单!

我的问题是: 我的方法有问题吗? 我刚刚在我的 Xperia Z 上注意到了这种行为,但我不确定我的代码中是否存在完全错误的地方,还有更多设备受到影响……

更新: 我试图覆盖:onKeyUp 和 onKeyDown 但没有调用这些方法。我的 onCreateOptionsMenu 中的断点也没有被命中。

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    默认的 Android 标题菜单

    它被称为操作栏。

    不一致是指显示在顶部的按钮数量因设备而异。

    这是设计使然。 Android 设备有多种屏幕尺寸。

    我的方法有问题吗?

    溢出是操作栏的一个功能。即使您在某些设备上隐藏操作栏,它会显示。但是,特别是在缺少专用 MENU 按钮的设备上,如果隐藏操作栏,则溢出将不可用。

    因此,如果您要隐藏操作栏,那很好,但您需要实现自己的菜单系统,就像游戏和其他应用一样。

    【讨论】:

    • 也许“不一致”是错误的词。听起来可能有点消极。我不想责怪这个设计,我知道它的实现方式是支持多种屏幕尺寸,并且如果有空间,只将按钮放在标题上。但是,我的菜单中有一个前进和后退按钮,如果前进按钮在顶部而后退按钮在底部菜单中,这对用户来说非常不方便……你能指出一些游戏如何实现这一点的资源吗?我更新了我的帖子并试图捕捉 keydown/keyup 事件,但没有调用。
    • @stefan:“但是,我的菜单中有一个前进和后退按钮,如果前进按钮在顶部而后退按钮在底部菜单中,这对用户来说非常不方便” -- 然后将它们设置为android:showAsAction="always",并在需要时允许其他项目进入溢出。 “你能给我指出一些游戏如何实现这一点的资源吗?” -- AFAIK,内置于各种游戏引擎中。 “我更新了我的帖子并试图捕捉 keydown/keyup 事件,但这没有被调用”——这无济于事,因为并非所有设备都有 MENU 键。
    • android:showAsAction="always" 不保证显示两个按钮。如果一个按钮有足够的空间,另一个按钮仍将被放入普通菜单。所以似乎我必须在我的自定义菜单栏上放置某种触发器,但这会破坏我的设计 有没有办法检测设备是否有菜单按钮?所以我可以只为特定设备显示这个按钮。
    • 好的。发现很多帖子... ViewConfiguration.get(context).hasPermanentMenuKey() 似乎对我有用 :) 感谢您的支持!
    【解决方案2】:

    还发现了这个:

     boolean hasMenu = ViewConfiguration.get(this).hasPermanentMenuKey();
            if(!hasMenu){
                //getWindow().setFlags(0x08000000, 0x08000000);
                try {
                         getWindow().addFlags(WindowManager.LayoutParams.class.getField("FLAG_NEEDS_MENU_KEY").getInt(null));
                  }
                  catch (NoSuchFieldException e) {
                    // Ignore since this field won't exist in most versions of Android
                  }
                  catch (IllegalAccessException e) {
                    Log.w("Optionmenus", "Could not access FLAG_NEEDS_MENU_KEY in addLegacyOverflowButton()", e);
                  }
            }
    

    这里: How to show option menu in android 4.2

    你怎么看? 似乎可以在我的 Xperia 上使用。

    更新: 但不是在 Nexus 10、华硕 Transformer TF 300 上。 旧版菜单存在但无法正常工作。

    最终解决方案:->基于PopupWindow创建了我自己的菜单

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 2014-03-21
      • 1970-01-01
      • 2020-08-08
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多