调用openOptionsMenu()菜单不显示

来源:互联网 发布:centos无法输入密码 编辑:程序博客网 时间:2024/05/07 03:17

最近在实际开发中碰到按遥控器菜单键没有显示出菜单的情况,使用onKeyDown(int keyCode, KeyEvent event)监听:

    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {       if(keyCode == KeyEvent.KEYCODE_MENU){            Log.d("tag","keydown keycode:"+keyCode);            return true;        }        return super.onKeyDown(keyCode, event);    }output:keydown keycode:82

这里我们可以看到已经监听到了菜单点击事件,既然系统没有为我们执行显示菜单的代码,那我们可以自己手动的去调用:

    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {       if(keyCode == KeyEvent.KEYCODE_MENU){            //手动调用            super.openOptionsMenu();            return true;        }        return super.onKeyDown(keyCode, event);    }

可惜,实际情况是没什么效果…为什么了跟踪到openOptionsMenu()源码里面发现执行了Window下的抽象方法:

    /**     * Programmatically opens the options menu. If the options menu is already     * open, this method does nothing.     */    public void openOptionsMenu() {        if (mWindow.hasFeature(Window.FEATURE_OPTIONS_PANEL) &&                (mActionBar == null || !mActionBar.openOptionsMenu())) {            mWindow.openPanel(Window.FEATURE_OPTIONS_PANEL, null);        }    }
public abstract void openPanel(int featureId, KeyEvent event);

openPanel()方法最终被Window的子类PhoneWindow实现(window操作系统双击shift可搜索)

PhoneWindow 类直接搜索openPanel()方法可以看到:

 ... private void openPanel(final PanelFeatureState st, KeyEvent event) {             // Don't open an options panel for honeycomb apps on xlarge devices.        // (The app should be using an action bar for menu items.)        if (st.featureId == FEATURE_OPTIONS_PANEL) {            Context context = getContext();            Configuration config = context.getResources().getConfiguration();            boolean isXLarge = (config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) ==                    Configuration.SCREENLAYOUT_SIZE_XLARGE;            boolean isHoneycombApp = context.getApplicationInfo().targetSdkVersion >=                    android.os.Build.VERSION_CODES.HONEYCOMB;            if (isXLarge && isHoneycombApp) {                return;            }        }  ...

从上面这段源码中可以看到,通过判断当前设备的屏幕及sdk的版本,若屏幕是大屏并且当前sdk版本大于11,则不再做其他处理,直接return;

既然已经知道了原因,那么我们可以在调用openOptionsMenu()的时候做一些处理:

    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        if(keyCode == KeyEvent.KEYCODE_MENU){            openOptionsMenu();            return true;        }        return super.onKeyDown(keyCode, event);    }  @Override    public void openOptionsMenu() {        Configuration config = getResources().getConfiguration();        //如果是大屏幕        if((config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK)> Configuration.SCREENLAYOUT_SIZE_LARGE) {            int originalScreenLayout = config.screenLayout;            config.screenLayout = Configuration.SCREENLAYOUT_SIZE_LARGE;            super.openOptionsMenu();            config.screenLayout = originalScreenLayout;        } else {            super.openOptionsMenu();        }    }

首先判断当前设备是否是大屏,如果是则先调整为较小屏调用菜单显示后在还原,到此菜单功能已经调整完成;最后在说源码中的一段注释:

 // Don't open an options panel for honeycomb apps on xlarge devices.// (The app should be using an action bar for menu items.)

这个是Android 源码里面的注释,意思也就是在说在大屏幕上推荐使用action bar来实现菜单功能

关于本文内容更多详细资料:

http://blog.csdn.net/mailyiran200101/article/details/9281177
http://stackoverflow.com/questions/9996333/openoptionsmenu-function-not-working-in-ics**

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 ipadair关不了机怎么办 联想电脑开不了机怎么办 ipad来不了机怎么办 深圳车牌租用怎么办的 电脑连wiwf老掉线怎么办 电脑要设置密码怎么办 苹果笔记本电脑忘记密码怎么办 换了外屏有缝隙怎么办 苹果7屏幕松动怎么办 平板电脑屏幕一直闪怎么办 平板电脑屏幕模糊了怎么办 平板电脑模糊怎么办啊 苹果没有声音了怎么办 微信视频回声怎么办 苹果手机总卡机不动怎么办 苹果手机不掉电怎么办 iphonex屏幕漏液怎么办 苹果6sp充不进电怎么办 iphone6充电越少怎么办 苹果6不能充电怎么办 脸部苹果肌很大怎么办 液晶屏上有划痕怎么办 苹果手机屏幕翘起来怎么办? iphone5s翘屏了怎么办 lpad触屏失灵怎么办 平板一直重启怎么办 苹果平板老死机怎么办 华为屏幕反应慢怎么办 平板屏幕没反应怎么办 iPadmini3触屏了怎么办 联想电脑触摸屏没反应怎么办 电脑触摸屏没反应怎么办 换屏后屏幕乱跳怎么办 联想平板进不去系统怎么办 平板触摸屏坏了怎么办 苹果6触摸不灵敏怎么办 5s home失灵怎么办? 平板触控失灵怎么办 ipad触摸屏坏了怎么办 ipad屏幕颠倒了怎么办 ipad电池坏了怎么办