Skip to content

菜单 (Menus)

源:Menus

菜单在临时表面上显示选项列表。M3 提供了两种变体。

菜单类型

  1. Dropdown menu (下拉菜单): 由按钮或图标触发。
  2. Exposed dropdown menu (暴露下拉菜单): 嵌入在文本框中,替代 Spinner。

1. 下拉菜单 (Dropdown Menu)

常用场景

  • 溢出菜单 (Overflow): 应用栏顶部的“更多”按钮。
  • 上下文菜单 (Context): 长按某个元素触发。
  • 弹出菜单 (Popup): 点击普通按钮触发。

代码实现

kotlin
val popup = PopupMenu(context, anchorView)
popup.menuInflater.inflate(R.menu.my_menu, popup.menu)
popup.setOnMenuItemClickListener { item ->
    // 处理点击
    true
}
popup.show()
xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/edit" android:title="编辑" android:icon="@drawable/ic_edit" />
    <item android:id="@+id/delete" android:title="删除" android:icon="@drawable/ic_delete" />
</menu>

2. 暴露下拉菜单 (Exposed Dropdown)

这是一种 M3 风格的下拉选择器,常用于表单。

代码实现

xml
<com.google.android.material.textfield.TextInputLayout
    style="@style/Widget.Material3.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
    android:hint="请选择城市">

    <AutoCompleteTextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="none"
        app:simpleItems="@array/city_options" />

</com.google.android.material.textfield.TextInputLayout>

主题化

你可以通过 textAppearanceLargePopupMenu 全局改变菜单项的字体。

xml
<style name="Theme.App" parent="Theme.Material3.*">
    <item name="textAppearanceLargePopupMenu">@style/MyMenuTextAppearance</item>
    <item name="popupMenuBackground">@drawable/custom_menu_bg</item>
</style>