将圆形彩色背景应用于 Material PopupMenu 组件的正确方法是啥?

Posted

技术标签:

【中文标题】将圆形彩色背景应用于 Material PopupMenu 组件的正确方法是啥?【英文标题】:What is the correct way to apply a round, colored background to a Material PopupMenu Component?将圆形彩色背景应用于 Material PopupMenu 组件的正确方法是什么? 【发布时间】:2021-10-01 23:28:02 【问题描述】:

我正在尝试制作一个带有圆角和自定义字体的弹出菜单。我正在使用来自 material.io 的材质菜单。我想实现这样的目标:

到目前为止,我尝试的是使用 PopupMenu 并使用自定义背景可绘制对象添加样式参数:

    在question 中看到答案后,我使用了 ContextThemeWrapper 以便我的样式真正生效。没有这个,样式更改将不起作用
    private fun showAddGoalsMenu(view: View) 
        val wrapper = ContextThemeWrapper(context, R.style.PopupMenu)
        val popupMenu = PopupMenu(wrapper, view)
        popupMenu.inflate(R.menu.menu_add_goals)

        ...
    
    从这个material.io menu theming example,我尝试在主应用程序样式中设置属性popupMenuBackground,并尝试在个人样式中设置android:popupBackground。但背景不适用:

    从其他答案(question 1、question 2、question 3)中,我发现了其他属性,如backgroundandroid:backgrounditemBackgroundandroid:itemBackground。由此,
backgroundandroid:background 仅适用于设置颜色。如果我将自定义可绘制对象设置为背景,它也会弄乱项目:

itemBackgroundandroid:itemBackground 只为单个项目设置背景。因此,如果我应用圆形背景,结果如下所示:

我的样式代码目前看起来像这样。根据我到目前为止所阅读的内容,这应该可行。但是....叹息。我已经注释掉了我所做的所有实验。

    <style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorSecondary">@color/colorSecondary</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="bottomNavigationStyle">@style/Widget.App.BottomNavigationView</item>

        <!--<item name="textAppearanceLargePopupMenu">@style/TextAppearance.App.Subtitle1</item>-->
        <!--<item name="textAppearanceSmallPopupMenu">@style/TextAppearance.App.Subtitle1</item>-->
        <!--<item name="popupMenuBackground">@drawable/custom_popup_background</item>-->
        <item name="popupMenuStyle">@style/PopupMenu</item>
    </style>

    <style name="PopupMenu" parent="Widget.MaterialComponents.PopupMenu">
        <item name="android:dropDownHorizontalOffset">-4dp</item>
        <item name="android:dropDownVerticalOffset">4dp</item>
        <item name="android:popupBackground">@drawable/custom_popup_background</item>
        <!--<item name="android:itemBackground">@drawable/black_popup_background</item>-->
        <item name="popupMenuBackground">@drawable/custom_popup_background</item>
        <!--<item name="background">@color/colorPrimary</item>-->
        <!--<item name="android:background">@drawable/custom_popup_background</item>-->
        <item name="android:background">@color/colorPrimary</item>-->
<!--        <item name="itemBackground">@drawable/black_popup_background</item>-->
        <item name="textAppearanceLargePopupMenu">@style/TextAppearance.App.Subtitle1</item>
        <item name="textAppearanceSmallPopupMenu">@style/TextAppearance.App.Subtitle1</item>
    </style>


    <style name="TextAppearance.App.Subtitle1" parent="TextAppearance.MaterialComponents.Subtitle1">
        <item name="fontFamily">@font/amaranth</item>
        <item name="android:fontFamily">@font/amaranth</item>
        <item name="android:textColor">#1E2D58</item>
    </style>

这是我的自定义背景可绘制对象

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/colorPrimary"/>
    <corners
        android:radius="16dp"/>
    <padding
        android:bottom="8dp"
        android:top="8dp"/>
</shape>

为了测试 itemBackground,我创建了一个 black_popup_background.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/colorSecondary"/>
    <corners
        android:radius="16dp"/>
    <padding
        android:bottom="8dp"
        android:top="8dp"/>
</shape>

我得到的输出是:

我不知道我做错了什么。提前感谢所有帮助!

【问题讨论】:

【参考方案1】:

对于以后遇到此问题的任何人。

我犯的错误是在我的代码中使用 android.widget.PopupMenu 而不是 androidx.appcompat.widget.PopupMenu。一旦我替换了这种用法,样式就起作用了。

最终,我的风格看起来和提到的here一样。

【讨论】:

以上是关于将圆形彩色背景应用于 Material PopupMenu 组件的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将图例中的 ggplot 彩色线条更改为正方形或圆形

Angular Material Table - 将动态背景颜色应用于一行(Angular 2+)

使用背景颜色的多色圆形div?

使用背景颜色的多色圆形 div?

将 MUI 主题应用于创建的 DOM 节点

无法将多背景颜色应用于材质 ui 快餐栏