今天工程建个菜单项,查查资料,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.
















