调用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
- 调用openOptionsMenu()菜单不显示
- MDI中不显示菜单
- skinmagic对话框菜单不显示
- Qt 菜单图标不显示
- Android 菜单显示和调用
- VS2005列表框下拉菜单不显示
- android 设备虚拟菜单键不显示
- 开机时不显示启动菜单grub
- 解决ubuntu下eclipse菜单不显示
- Linux下Qt菜单不显示问题
- ubuntu下sts不显示菜单
- 复制粘贴菜单不显示中文
- Android菜单不显示ICON解决方案
- ubuntu16.04不显示菜单项
- Android菜单项图标不显示
- Android-右上角menu菜单不显示
- Ubuntu liveCD修复Grub菜单不显示
- android fragment 菜单项/工具栏不显示
- 搭建idea出现无法自动映射Mapper问题
- java的向上向下转型
- 手写实现spring mvc
- 超级简单的单元测试JUnit4入门实例
- How to use Android HW Video Codec
- 调用openOptionsMenu()菜单不显示
- Android系统信息获取
- android开发中的同步和异步区别的理解
- php--防盗链简介
- Maven中的dependencyManagement
- 山科大 oj Caesar密码
- C++(4):函数的输入参数和返回值
- C++单链管理学生信息
- android开发中通用标题栏的设置与使用