【问题标题】:Android Toolbar Popup menu not showing iconsAndroid 工具栏弹出菜单不显示图标
【发布时间】:2015-06-15 12:56:39
【问题描述】:

我正在尝试为我的工具栏显示一个下拉菜单,其中包括文本和图标:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/menu_add"
        android:title="@string/menu.add"
        android:icon="@drawable/ic_add_black_24dp"
        app:showAsAction="always" />

    <item
        android:id="@+id/menu_edit"
        android:title="@string/menu.edit"
        android:icon="@drawable/ic_create_black_24dp"
        app:showAsAction="never" />

</menu>

menu_add 确实在工具栏本身上显示图标,但 menu_edit 仅显示没有图标的文本。

这个答案:https://stackoverflow.com/a/19750717/197127 表示 Google 已通过设计将其删除,但并未提及您如何覆盖它。

编辑

我还需要设备“菜单”按钮来显示相同​​的菜单。

【问题讨论】:

    标签: android android-menu android-toolbar


    【解决方案1】:

    我创造了这样的东西:

    @SuppressLint("RestrictedApi")
    fun Menu.showIcons() {
        (this as? MenuBuilder)?.setOptionalIconsVisible(true)
    }
    

    它基本上适用于任何菜单。

    对于工具栏,您可以在活动或片段中覆盖onPrepareOptionsMenu,在调用super 之前只需调用menu.showIcons() 或者您可以将其与PopupMenu 一起使用,就像PopupMenu(requireContext(), anchor).menu.showIcons() 一样。

    【讨论】:

    • 我不知道你为什么没有收到更多的点赞。这是唯一对我有用的解决方案,也是最简单的。
    【解决方案2】:

    是的,它不会显示在新版本的支持库中,但您可以通过添加子菜单来解决问题。 (您可以通过 xml 和代码添加它)。 像这样:

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto">
        <item
            android:id="@+id/action_settings"
            android:icon="@drawable/abc_ic_menu_moreoverflow_mtrl_alpha"
            android:title="@string/action_settings"
            app:showAsAction="always">
            <menu>
                <item
                    android:icon="@drawable/ic_event"
                    android:title="@string/action_settings"
                    app:showAsAction="always" />
                <item
                    android:icon="@drawable/ic_event"
                    android:title="@string/action_settings"
                    app:showAsAction="always" />
            </menu>
        </item>
    </menu>
    

    希望它有所帮助:) 编辑:查看上述代码的快照:

    =>

    【讨论】:

    • 谢谢哈利。如果我将它添加为我的一个项目的子菜单,我会得到一个“介于两者之间”的菜单。我需要它作为溢出打开。
    • 看快照,这是你想要的吗?
    • 是的。单击溢出按钮(三个垂直点)后,我需要打开它。
    • 这就是我向您展示的,这是我给定代码的输出。正确地遵循它。
    • 你是正确的右上角菜单。但如果用户单击设备菜单按钮,它将不起作用。有什么想法吗?
    【解决方案3】:

    它不适用于支持 android 的 v7 版本,但您可以通过稍微修改来调整它。下面的代码对我有用

    <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_settings"
        android:icon="@drawable/abc_ic_menu_moreoverflow_mtrl_alpha"
        android:title="@string/action_settings"
        app:showAsAction="always">
        <menu>
    
            <item
                android:id="@+id/action_rate"
                android:icon="@drawable/ic_grade_black_24dp"
                android:orderInCategory="100"
                android:title="@string/action_rate"
                app:showAsAction="never" />
            <item
                android:id="@+id/action_share"
                android:icon="@drawable/ic_share_black_24dp"
                android:orderInCategory="101"
                android:title="@string/action_share"
                app:showAsAction="never" />
            <item
                android:id="@+id/action_enquiry"
                android:icon="@drawable/ic_message_black_24dp"
                android:orderInCategory="102"
                android:title="@string/action_enquiry"
                app:showAsAction="never" />
            <item
                android:id="@+id/action_disclaimer"
                android:icon="@drawable/ic_info_black_24dp"
                android:orderInCategory="103"
                android:title="@string/action_disclaimer"
                app:showAsAction="never" />
        </menu>
    </item>
    

    【讨论】:

      【解决方案4】:

      我找到了这个解决方案:https://stackoverflow.com/a/30337653/197127。基本上,覆盖一个方法并且它不会破坏设备菜单按钮或溢出。 谢谢大家。

      【讨论】:

        【解决方案5】:

        试试这个

         MenuPopupHelper menuHelper = new MenuPopupHelper(getContext(), (MenuBuilder) 
         popupmenu.getMenu(), button);
         menuHelper.setForceShowIcon(true);
         menuHelper.show();
        

        为我工作。

        【讨论】:

          【解决方案6】:

          我创造了这样的东西: 试试这个:

              Menu menu= toolbar.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();
              }
          

          【讨论】:

            【解决方案7】:

            从上述3.0的android弹出菜单中的图标不显示,所以你必须欺骗它,这个工作你可以试试

               //init the popup
               PopupMenu popup = new PopupMenu(context, anchor);
             
                    /*  The below code in try catch is responsible to display icons*/
                        try {
                            Field[] fields = popup.getClass().getDeclaredFields();
                            for (Field field : fields) {
                                if ("mPopup".equals(field.getName())) {
                                    field.setAccessible(true);
                                    Object menuPopupHelper = field.get(popup);
                                    Class<?> classPopupHelper = Class.forName(menuPopupHelper.getClass().getName());
                                    Method setForceIcons = classPopupHelper.getMethod("setForceShowIcon", boolean.class);
                                    setForceIcons.invoke(menuPopupHelper, true);
                                    break;
                                }
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
             
                    //inflate menu
                    popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
             
                    //show menu
                    popup.show();
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-01-01
              • 1970-01-01
              • 2016-12-11
              相关资源
              最近更新 更多