终于暂时解决了actionbar溢出菜单显示图标的问题

来源:互联网 发布:趣发现是什么软件 编辑:程序博客网 时间:2024/06/07 03:02

为什么说暂时解决了,因为只是找到了解决方法,还不确定为什么会这样,只能等以后有时间再研究。

先说下情况,采用了 AppCompat Theme,以往旧的方法都不好使,溢出菜单中的图标死活不显示,只有title,网上搜了一堆方案,给出的代码大都是如下:

@Override        public boolean onMenuOpened(int featureId, Menu menu)        {            if(featureId == Window.FEATURE_ACTION_BAR && menu != null)            {                if(menu.getClass().getSimpleName().equals("MenuBuilder"))                {                    try                    {                        Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);                        m.setAccessible(true);                        m.invoke(menu, true);                    }                    catch(NoSuchMethodException e)                    {                        Log.e("Menu:", "onMenuOpened", e);                    }                    catch(Exception e)                    {                        throw new RuntimeException(e);                    }                }            }            return super.onMenuOpened(featureId, menu);        }

后来发现原来是 点击溢出菜单时,回调方法onMenuOpened 一直不执行!

当然此时 菜单的添加方式是

通过getMenuInflater().inflate(R.menu.main, menu);     加载的,将菜单item写到menu目录下的xml文件中,通过这种方法,加载菜单的title,但是onMenuOpened 并未执行,真是奇怪。


备注:如果菜单是通过下面方式添加的,还是可以执行的,从而也能添加溢出菜单中的图标,

setIconEnable(menu, true);  MenuItem item1 = menu.add(0, 1, 0, R.string.app_name);          item1.setIcon(R.drawable.ofm_qrcode_icon);          MenuItem item2 = menu.add(0, 1, 0, R.string.app_name);          item2.setIcon(R.drawable.ofm_feedback_icon);          return super.onCreateOptionsMenu(menu); 

但是这样麻烦啊,菜单不能通过xml来加载。

至于为什么采用第一种方式添加菜单时,onMenuOpened 方法不执行,没找到确定原因,仅在下面页面中看到一点答复:

https://code.google.com/p/android/issues/detail?id=171440   原文回复是“The reason that onMenuOpened() and onPanelClosed() are not called is that Activity's default implementations of those methods will try and init the framework Action Bar.

We may need to another feature id for AppCompat's action bar.

只是看这个,还是不解决眼前问题,不知道到咋做啊。

后来发现,虽然onMenuOpened方法不执行,但是onPrepareOptionsMenu(Menu menu)、onPrepareOptionsPanel(View view, Menu menu) 等都可以执行,

于是采用下面的方法:

@Overridepublic boolean onPrepareOptionsMenu(Menu menu) {   if (menu != null) {         if (menu.getClass().getSimpleName().equals("MenuBuilder")) {              try {                   Method m = menu.getClass().getDeclaredMethod(                          "setOptionalIconsVisible", Boolean.TYPE);                  m.setAccessible(true);                  m.invoke(menu, true);              } catch (Exception e) {                  Log.e(getClass().getSimpleName(), "onMenuOpened...unable to set icons for overflow menu", e);              }           }       } return super.onPrepareOptionsMenu(menu);}

或者放到

@Override 

 protected boolean onPrepareOptionsPanel(View view, Menu menu) {

   ……

//方法语句 

   ……

 return super.onPrepareOptionsPanel(view, menu);

}

都可以执行,折腾许久的菜单图标也终于出来了!





0 0
原创粉丝点击