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

che*_*ist 6 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>
Run Code Online (Sandbox Code Playgroud)

menu_add 确实与工具栏上的图标一起显示,但 menu_edit 只显示没有图标的文本。

这个答案:https : //stackoverflow.com/a/19750717/197127说谷歌已经按设计删除了它,但没有提到你可以如何覆盖它。

编辑

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

Kik*_*kju 12

我创建了这样的东西:

@SuppressLint("RestrictedApi")
fun Menu.showIcons() {
    (this as? MenuBuilder)?.setOptionalIconsVisible(true)
}
Run Code Online (Sandbox Code Playgroud)

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

对于工具栏,您可以onPrepareOptionsMenu在活动或片段中覆盖,并且在调用之前super只需调用,或者您可以像这样menu.showIcons()使用它。PopupMenuPopupMenu(requireContext(), anchor).menu.showIcons()


Sat*_*ngh 7

这段 Kotlin 代码对我有用。我用了“popup.setForceShowIcon(true)”

val popup = PopupMenu(上下文, 按钮);

popup.menuInflater.inflate(menuRes, popup.menu);

popup.setForceShowIcon(true)

完整代码写在下面

//R.menu.menu_popup -- Menu xml File
<menu
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_1"
        android:icon="@drawable/email"
        android:title="Email" />
    <item android:id="@+id/menu_2"
        android:icon="@drawable/phone"
        android:title="Phone" />
</menu>

// Inside Activity
findViewById<Button>(R.id.button1).setOnClickListener {
    show_PopUp_Menu(this, it, R.menu.menu_popup)
}


@SuppressLint("RestrictedApi")
fun show_PopUp_Menu(context: Context, button:Button, menuRes: Int) {

    val popup = PopupMenu(context, button)
    popup.menuInflater.inflate(menuRes, popup.menu)

    popup.setOnMenuItemClickListener { menuItem: MenuItem ->
        when(menuItem.itemId){
            R.id.menu_1->{
                Toast.makeText(this, "Menu 1 clicked", Toast.LENGTH_SHORT).show()
                true
            }
            R.id.menu_2->{
                Toast.makeText(this, "Menu 2 clicked", Toast.LENGTH_SHORT).show()
                true
            }
            else -> false
        }
    }
    
    popup.setOnDismissListener {
        // Respond to popup being dismissed.
    }
    popup.setForceShowIcon(true)
    popup.show()
}
Run Code Online (Sandbox Code Playgroud)


Har*_*rry 5

是的,它不会显示在新版本的支持库中,但您可以通过添加子菜单来解决这个问题。(您可以通过 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>
Run Code Online (Sandbox Code Playgroud)

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

菜单 => 菜单打开


che*_*ist 3

我找到了这个解决方案:/sf/answers/2123635741/。基本上,重写方法不会破坏设备菜单按钮或溢出。谢谢大家。