android 不显示menu 按键

本文介绍了如何在缺少实体Menu键的Android设备上显示虚拟Menu按键的方法,包括通过设置targetSdkVersion和使用特定代码实现虚拟Menu键的显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天工程建个菜单项,查查资料,openOptionsMenu 、onCreateOptionsMenu 、onOptionsItemSelected 神马的很奈奈的搞定。

但是很快发现三星上,有实体menu 按键当然OK啦,放在华为上,虚拟按键,根本就木有显示menu按键,啥!木有啊~!

 在网上努力搜了好久的信息,才发现

Google希望开发者开始设计Android3.0接口,让冰激淋三明治与蜂巢可以无缝结合。在屏幕上的空间有限,所以“动作隐藏”按钮就派上用场了:垂直省略符号能够帮助隐藏进程。这些垂直隐藏也许是次要的选项,不适合放置在动作栏中。
冰激淋三明治界面还将右侧导航栏作为替换菜单按钮的功能,主要是因为它与菜单功能相同,只是位置不同;谷歌还将Android与其应用程序的设计进行风格统一化管理。
额~,放到了 actionBar里?

那就显示actionBar,果然有。

但是我的软件就是为了利用宝贵的屏幕空间,弄出个全屏模式,按键什么的都自己有用了,就是在更改设置时使用菜单项,为了菜单键我开个actionBar?

好吧,那就把 targetSdkVersion 改到低版本试试,改了个11试试:

嗯,有了。可是囧的是,每个每个activity都会出现那个菜单。当然,问题没啥,但是看着又有点点不爽。一定还有其他办法,再找!


皇天不负有心人,终于让俺找到了。

感谢mergerly同学,这是他的博文地址:http://blog.youkuaiyun.com/mergerly/article/details/10140595

虽然你也是转载的(汗),但是我是从你那看到的,也感谢不知名的原作者(mergerly 同学未注明出处)。

我也充当次知识的搬运工,总结如下:


一、关于某些Android手机上的虚拟按键的显示问题:

在某些只有在显示屏上显示虚拟按键的手机上,有些应用的menu键不能显示出来。在PhoneWindow.generateLayout函数中有如下代码:

[java]  view plain copy
  1. final int targetSdk = context.getApplicationInfo().targetSdkVersion;  
  2.         final boolean targetPreHoneycomb = targetSdk < android.os.Build.VERSION_CODES.HONEYCOMB;  
  3.         final boolean targetPreIcs = targetSdk < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH;  
  4.         final boolean targetHcNeedsOptions = context.getResources().getBoolean(  
  5.                 com.android.internal.R.bool.target_honeycomb_needs_options_menu);  
  6.         final boolean noActionBar = !hasFeature(FEATURE_ACTION_BAR) || hasFeature(FEATURE_NO_TITLE);  
  7.         if (targetPreHoneycomb || (targetPreIcs && targetHcNeedsOptions && noActionBar)) {  
  8.             addFlags(WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY);  
  9.         } else {  
  10.             clearFlags(WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY);  
  11.         }  
从这里可以看出,默认情况下,我们的menu键在满足一下条件情况下能显示出来:


1. targetPreHoneycomb = targetSdk < android.os.Build.VERSION_CODES.HONEYCOMB;
即android:targetSdkVersion="xxx" xxx小于11


2. android:targetSdkVersion 为11,12或者13,且该activity没有title和actionBar。
可能android希望我们以后使用actionBar代替menu键。

针对activity不能显示menu键的问题,
1.大家可以修改targetSDK,并去掉actionbar和title。
2.在 xxxActivity的哦你Create函数中,setContentView之后调用 Window.getFlags()来强行设置menu键的可见性。如:

[java]  view plain copy
  1. xxxActivity.java  
  2. public void  onCreate()  
  3. {  
  4. ....  
  5.   setContentView(R.layout.oppo_player);  
  6.         getWindow().setFlags(WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY,  
  7.                             WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY);   
  8.   ...  
  9. }  
若是想去掉menu键,而不想改targetSDK,可以在 xxxActivity的哦你Create函数中,setContentView之后调用 Window.clearFlags(WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY);来强者隐藏menu的三个点图标
注:getWindow().setFlags(WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY, WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY); 
如果报错的话,则改为下面语句(我的编译环境下报错,所以是通过下面方式调用的,已测试通过)
getWindow().setFlags(0x08000000, 0x08000000);

(PS:我试了下,FLAG_NEEDS_MENU_KEY也报错,使用0x08000000成功显示,原文“强者隐藏”(估计是强制隐藏的意思)应该是笔误,应该是强制显示


二、有时候应用需要使用菜单按钮,但是有的机型没有实体按键,同时4.0以上系统又没有右下角那个虚拟菜单按钮(就是3个点的按钮),这个告诉大家添加的方法。
在onCreate设置这么一段代码:

[java]  view plain copy
  1. try {  
  2.     getWindow().addFlags(WindowManager.LayoutParams.class.getField("FLAG_NEEDS_MENU_KEY").getInt(null));  
  3. }catch (NoSuchFieldException e) {  
  4.     // Ignore since this field won't exist in most versions of Android  
  5. }catch (IllegalAccessException e) {  
  6.     Log.w("feelyou.info""Could not access FLAG_NEEDS_MENU_KEY in addLegacyOverflowButton()", e);  
  7. }  


还有,记得上面代码要放在onCreate() 里setContentView()之后。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值