今天工程建个菜单项,查查资料,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函数中有如下代码:
- final int targetSdk = context.getApplicationInfo().targetSdkVersion;
- final boolean targetPreHoneycomb = targetSdk < android.os.Build.VERSION_CODES.HONEYCOMB;
- final boolean targetPreIcs = targetSdk < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH;
- final boolean targetHcNeedsOptions = context.getResources().getBoolean(
- com.android.internal.R.bool.target_honeycomb_needs_options_menu);
- final boolean noActionBar = !hasFeature(FEATURE_ACTION_BAR) || hasFeature(FEATURE_NO_TITLE);
- if (targetPreHoneycomb || (targetPreIcs && targetHcNeedsOptions && noActionBar)) {
- addFlags(WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY);
- } else {
- clearFlags(WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY);
- }
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键的可见性。如:
- xxxActivity.java
- public void onCreate()
- {
- ....
- setContentView(R.layout.oppo_player);
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY,
- WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY);
- ...
- }
注: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设置这么一段代码:
- try {
- getWindow().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("feelyou.info", "Could not access FLAG_NEEDS_MENU_KEY in addLegacyOverflowButton()", e);
- }
还有,记得上面代码要放在onCreate() 里setContentView()之后。