6

所以我长期面临这个问题。我有运行 Android 4.3 的 Nexus 4 和 Nexus 7,并且我有 targetSdkVersion="11" 的应用程序(“我使用 11,因为任何低于 11 的目标 sdk 都不支持我的多点触控)。问题是该 3 点菜单在 Nexus 4 上显示,但在 Nexus 7 上不显示。只有当我输入 targetSdkVersion="8" 但多点触控不起作用时,nexus 7 上的 3 点菜单按钮才有效

连结 4: 在此处输入图像描述

连结 7: 在此处输入图像描述

代码 :

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="11" />

截图:nexus 7在此处输入图像描述

联系 4: 在此处输入图像描述

4

5 回答 5

12

如果您特别想知道为什么没有显示按钮,那么当 Android 确定是否需要旧版菜单按钮时,以下规则适用:

  • 如果目标 API 版本低于 11,则会在所有设备上显示
  • 如果目标版本是 11、12 或 13(即仅限平板电脑的 Honeycomb),Android 假定您的应用是为平板电脑设计的,不会在平板电脑上显示旧版按钮,但会在手机上显示
  • 如果目标是 14 或更高版本(ICS 及更高版本),Android 会假定您的应用是为平板电脑和手机设计的,因此不会显示旧版按钮。

但就像其他答案所说,你不应该使用这个菜单按钮。如果您不想要整个 ActionBar,另一种选择是在您的活动中使用一个三点按钮,该按钮显示一个使用PopupMenu.

于 2013-12-22T21:38:24.367 回答
9

你不应该再使用那个菜单了。从菜单文档:

在 Android 3.0 及更高版本上,选项菜单中的项目由操作栏显示为屏幕操作项目和溢出选项的组合。从 Android 3.0 开始,不推荐使用菜单按钮(某些设备没有),因此您应该迁移到使用操作栏来提供对操作和其他选项的访问。

使用操作栏。

于 2013-11-02T20:19:04.247 回答
2

正确的解决方案是使用 anActionBar但可能有一些技巧可以让溢出菜单出现。

具体来说,FLAG_NEEDS_MENU_KEY您可以通过反射访问一个隐藏的窗口标志。这是一个代码片段(来自此博客):

public static void addLegacyOverflowButton(Window window) {
  if (window.peekDecorView() == null) {
    throw new RuntimeException("Must call addLegacyOverflowButton() after setContentView()");
  }

  try {
    window.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(TAG, "Could not access FLAG_NEEDS_MENU_KEY in addLegacyOverflowButton()", e);
  }
}

我在几个 Nexus 设备上对此进行了测试,并且可以正常工作。博客上的评论指出,有些设备无法正常工作。谨慎使用。并使用ActionBar,真的。

于 2013-12-17T20:01:32.930 回答
1

有一种简单的方法可以强制菜单选项停留在菜单溢出中。如果您使用 XML 创建菜单,则可以使用“showAsAction”属性强制执行此操作。

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/menu_option"
        android:showAsAction="never"
        android:title="@string/option_name" /> 

</menu>

如果将“showAsAction”设置为“never”,它将被强制不在ActionBar上显示,因此该选项将保留在菜单溢出中。

在官方 Android 文档网页上有更多信息(例如如何将 XML 菜单文件传递到 Activity):http: //developer.android.com/guide/topics/resources/menu-resource.html

我希望这会有所帮助!

于 2013-12-19T02:20:10.447 回答
0

我不会总是推荐使用这个,因为它破坏了手机的一致性,但是如果你想要“3点”菜单,也就是所谓的溢出菜单,你需要添加这个方法

 //Hack to display overflowMenu on devices with a menu button
 private void getOverflowMenu() {

     try {
        ViewConfiguration config = ViewConfiguration.get(this);
        Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
        if(menuKeyField != null) {
            menuKeyField.setAccessible(true);
            menuKeyField.setBoolean(config, false);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

并在您onCreate()调用此方法时。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
setContentView(R.layout.Activity); 

getOverflowMenu();
}
于 2013-12-23T20:15:40.180 回答