菜单按钮不显示在nexus 7上

时间:2013-11-02 20:08:25

标签: android

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

Nexus 4: enter image description here

Nexus 7: enter image description here

代码:

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

截图: nexus 7 enter image description here

nexus 4: enter image description here

5 个答案:

答案 0 :(得分:12)

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

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

但与其他答案一样,您不应该使用此菜单按钮。如果您不想要一个完整的ActionBar,另一个选项是在您的活动中使用三点式按钮,该按钮会显示使用PopupMenu的菜单。

答案 1 :(得分:9)

您不应该再使用该菜单了。来自the Menus documentation:

  

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

使用ActionBar。

答案 2 :(得分:2)

正确的解决方案是使用ActionBar,但可能会有一些黑客可以显示溢出菜单。

具体来说,您可以通过反射访问隐藏的窗口标记FLAG_NEEDS_MENU_KEY。这是一段代码段(来自this blog):

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,真的。

答案 3 :(得分: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

我希望这会有所帮助!

答案 4 :(得分: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();
}