onMenuOpened不调用问题

来源:互联网 发布:淘宝无线链接 编辑:程序博客网 时间:2024/05/19 14:19
看我上篇博客 android 不显示menu 按键 ,刚刚解决华为么menu 按键问题,又遇见一个问题。真是一波刚平一波又起。

在代码中,我不使用系统的菜单,而是按照自己定义的。但是,三星上好好的,放到华为上又出问题。这让我想起刚搞android时弄视音频,自己测试好好的,在HTC机和小米上老是各种bug。

唉,还是回过头来瞧瞧现在啥问题。发现,原来onMenuOpened在华为上木有被调用,这是嘛回事啊?

上网!(发现自从转做android,上网频率明显飙升)。度娘告诉我(敏感时期,谷歌最近一直上不去),很多小伙伴也遇见这个问题,但是好像么有人给出解决办法,大家吐槽onMenuOpened太不好用了。


网上还是有牛人,其他地方给了这个方案:

在按键监听中监听 KeyEvent.KEYCODE_MENU 事件,然后自己进行处理。

嗯,这的确是个办法。但我觉得既然有手机能用,二者也差不到(一三星G3509,4.1版本,另华为P6,4.2版本),那么应该有更优美的办法,实在不行,再回头用这个办法。


自己一股脑重写了  onMenuOpened、closeOptionsMenu、onOptionsMenuClosed、onOptionsItemSelected、openOptionsMenu、onCreateOptionsMenu,进行log打印调试。当然openOptionsMenu、closeOptionsMenu始终没被调用,这是自己主动调用时会使用的。


正文:

1,既然要显示自己menu ,那 onMenuOpened 中要

 return false;
返回为true 则显示系统menu。

三星流程是下面这样的

//【流程1】 ① 头次按下menu键,执行onCreateOptionsMenu() --> onMenuOpened();② 后面再按menu,执行onMenuOpened()


华为P6流程是下面这样的

//【流程2】① 头次按下menu键,执行onCreateOptionsMenu();② 后面再按menu,均无反应

2,改为返回true 以显示系统menu试试,二者和上面各自的流程一样;

3,既然如此,在 onCreateOptionsMenu 中增加

menu.add("menu");
原来因为不用系统菜单,所以就没往里增加菜单项。ps:onCreateOptionsMenu 则要返回true,否则意味菜单失败,每次按menu键,就只执行onCreateOptionsMenu。

三星流程是下面这样的

//【流程3】 ① 头次按下menu键,执行onCreateOptionsMenu() --> onMenuOpened(),界面显示menu菜单;② 再按menu键,执行onOptionsMenuClosed(),关闭菜单;③ 再按menu键,执行onMenuOpened(),界面显示menu菜单;④ 按menu菜单项,执行onOptionsItemSelected,按键操作,这里什么也没做,然后onOptionsMenuClosed(),关闭菜单


华为流程与三星流程一样。


4,现在再回过头,将onMenuOpened 返回值改回false;

华为、三星流程都与【流程1】一样


总结:

根据上面推测,三星每次按键都执行了onMenuOpened, 华为会判断菜单是否内容为空,只有在menu有选项时才执行

华为估计认为,既然创建菜单时菜单都是空的,那还打开、显示个P啊!干脆别执行后面的了,浪费资源。

嗯,貌似挺有道理的,但是忽略了想个别情况下(像我这种),使用自定义的东东。作为开发者,我们(至少我是)也想当然的认为,既然我都不用你的菜单,我还往你那添加毛个菜单项,更别说去要显示它了。

当然,以上仅为我个人猜测。

最后,俺还是在onCreateOptionsMenu添加了选项(虽然没用到过)。


0 0
原创粉丝点击