给Android4.0以上系统加上虚拟菜单按键

一、关于某些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);
        }
从这里可以看出,默认情况下,我们的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键的可见性。如:

xxxActivity.java
public void  onCreate()
{
....
  setContentView(R.layout.oppo_player);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY,
                            WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY); 
  ...
}
若是想去掉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);

二、有时候应用需要使用菜单按钮,但是有的机型没有实体按键,同时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);
}


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值