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

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

<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> <item android:id="@+id/action_search" android:title="@string/action_search" android:icon="@mipmap/ic_menu_search" android:orderInCategory="100" android:actionViewClass="android.widget.SearchView" app:showAsAction="ifRoom"/> <item android:id="@+id/menu_group_chat" android:title="@string/menu_group_chat" android:icon="@mipmap/ic_menu_groupchat" /> <item android:id="@+id/menu_add_friend" android:title="@string/menu_add_friend" android:icon="@mipmap/ic_menu_add_friend" /> 

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

 @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.点击溢出按钮的菜单

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

2.菜单键点击

closures菜单后,再次点击工具栏上的溢出button,出现菜单中的这些图标,

3.点击溢出按钮的菜单

它有多奇怪! 为什么会发生?

Solutions Collecting From Web of "在工具栏溢出菜单中显示菜单项图标时,这种奇怪的情况是怎么发生的?"

对于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的操作栏)。

对于上述情况,片段类如下:

 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包含菜单如下

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:id="@+id/fragment_toolbar" android:layout_height="wrap_content" android:background="@color/colorPrimary" android:elevation="4dp"> </android.support.v7.widget.Toolbar> //...other items </LinearLayout> 

一个典型的菜单文件被实现为res/menu/my_fragment_menu.xml 。 该片段被添加到mainActivity的布局中,就像

 <fragment android:id="@+id/my_fragment_id" android:name="com.appspot.trendy.trendychart.MyFragment" android:layout_width="match_parent" android:layout_height="match_parent"/>