在工具栏溢出菜单中显示菜单项图标时,如何发生这种奇怪的情况?

我想在工具栏中显示溢出菜单(AppCompat-v7:22.1.1),下面是我的menu_main.xml。

    

运行我的应用程序后,菜单项的图标没有显示,然后我尝试了这个解决方案 ,在我的Activty中添加了一个覆盖方法onMenuOpened()(从AppCompatActivity扩展),

 @Override public boolean onMenuOpened(int featureId, 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) { e.printStackTrace(); } } } return super.onMenuOpened(featureId, menu); } 

但在运行此演示后,我发现图标仍未显示。

1.单击溢出按钮的菜单

从这个报道的问题 ,我知道在22.x中不再调用AppCompatActivity.onMenuOpened,但奇怪的是,当我点击Genymotion中的硬件菜单键时,菜单出现在底部并带有图标,

2.单击菜单键的菜单

关闭菜单后,我再次单击工具栏中的溢出按钮,菜单中出现这些图标,

3.单击溢出按钮的菜单

多奇怪啊! 为什么会这样?

对于AppCompactActivity,您可以将此检查放在onPrepareOptionsPanel ()上。

 @Override protected boolean onPrepareOptionsPanel(View view, 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.onPrepareOptionsPanel(view, menu); } 

以下是AlécioCarvalho提供的优秀答案的修改。 如果需要正确显示不在主应用程序操作栏中的图标,而是在每个单独片段内的自定义工具栏中 (我想要一个具有自己标题的单独工具栏和每个片段的自定义操作菜单,而不仅仅是将新项添加到整个AppCompatActivity的操作栏中。

对于上述情况,Fragment类如下:

 public class MyFragment extends android.support.v4.app.Fragment { ... public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //at first get the very toolbar fragmentToolbar = (Toolbar) view.findViewById(R.id.fragment_toolbar); fragmentToolbar.setTitle(R.string.title_string); fragmentToolbar.showOverflowMenu(); //now ready to get the menu's method, which is responsible for icons, and change its properties Menu menu=fragmentToolbar.getMenu(); Method menuMethod = null; try { menuMethod = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE); menuMethod.setAccessible(true); menuMethod.invoke(menu, true); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } //now all the other stuff necessary for the toolbar operation fragmentToolbar.inflateMenu(R.menu.my_fragment_menu); fragmentToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem arg0) { if(arg0.getItemId() == R.id.menu_item_1){ ... } return false; } }); //and now the main stuff of onCreateView View view = inflater.inflate(R.layout.my_fragment_layout, container, false); return view; } } 

然后my_fragment_layout.xml包含如下菜单

    //...other items  

典型的菜单文件实现为res/menu/my_fragment_menu.xml 。 该片段在mainActivity的布局中添加简单为

  
 @SuppressLint("RestrictedApi") public void initToolBar(){ MenuBuilder menuBuilder = (MenuBuilder) toolbar.getMenu(); menuBuilder.setOptionalIconsVisible(true); } 

我这样解决了。

在此处输入图像描述