所以我长期面对这个问题。我有Nexus 4和Nexus 7都运行Android 4.3,我有应用程序使用targetSdkVersion =“11”(“我使用11,因为任何低于11的目标sdk不支持我的多点触控)。问题是Nexus 4上显示的是3点菜单但Nexus 7上没有显示。在nexus 7上的3点菜单按钮只有在我把targetSdkVersion =“8”但是多点触控无法工作时才有效
Nexus 4:
Nexus 7:
代码:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="11" />
截图: nexus 7
nexus 4:
答案 0 :(得分:12)
如果您特别想知道为什么没有显示按钮,则当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();
}