Android工具栏弹出菜单未显示图标

时间:2015-06-15 12:56:40

标签: android android-menu android-toolbar

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

<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已将其删除,但没有提及您如何覆盖它。

修改

我还需要设备&#34; menu&#34;按钮显示相同的菜单。

6 个答案:

答案 0 :(得分: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>

答案 1 :(得分:3)

我创建了这样的东西:

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

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

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

答案 2 :(得分:1)

是的,它没有显示在新版本的支持库中,但您可以通过添加子菜单来实现。 (您可以通过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>

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

menu =&gt; menu open

答案 3 :(得分:1)

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

答案 4 :(得分:0)

尝试

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

为我工作。

答案 5 :(得分:0)

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

    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();
    }