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

- Dropdown menu (下拉菜单): 由按钮或图标触发。
- 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>