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

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

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


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

额~,放到了

actionBar里?

那就显示actionBar,果然有。

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

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

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


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


虽然你也是转载的(汗),但是我是从你那看到的

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


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

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

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

[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小于112. 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. 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. "", "Could not access FLAG_NEEDS_MENU_KEY in addLegacyOverflowButton()", e);  
7. }  
8.