自定义弹出菜单样式

4

我目前正在使用这种样式来制作我的弹出菜单:

<style name="mainActivityTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="colorPrimary">@color/colorBlack</item>
    <item name="colorPrimaryDark">@color/colorBlack</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

然而,这会导致弹出菜单在顶部和底部有额外的空间:

enter image description here

我该如何使没有额外的空间?是否有某种样式可以包裹其内容?

编辑:我忘记提到我在程序中动态填充视图,这可能是一个问题。

private void inflateMoreMenu(View view){
        PopupMenu popupMenu = new PopupMenu(mContext, view);
        popupMenu.inflate(R.menu.popup_menu);
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {

                switch (item.getItemId()){
                    case R.id.popup_menu_report:
                        //Inflate a layout

                        break;
                    case R.id.popup_menu_block:
                        //Inflate a layout

                        break;

                }
                return false;
            }
        });

        @SuppressLint("RestrictedApi")
        MenuPopupHelper menuHelper = new MenuPopupHelper(mContext, (MenuBuilder) popupMenu.getMenu(), view);
        menuHelper.setForceShowIcon(true);
        menuHelper.show();
    }

弹出菜单的XML:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/popup_menu_report"
        android:title="Report"
        android:icon="@drawable/icon_messages_report"/>

    <item
        android:id="@+id/popup_menu_block"
        android:title="Block"
        android:icon="@drawable/icon_alertdialog_block"/>

</menu>
1个回答

8

对于OverflowMenu,您可以在应用程序主题中定义actionOverflowMenuStyle属性。

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
   <item name="actionOverflowMenuStyle">@style/popupOverflowMenu</item>
</style>

使用:

  <style name="popupOverflowMenu" parent="@style/Widget.MaterialComponents.PopupMenu.Overflow">
    <item name="android:popupBackground">@drawable/my_mtrl_popupmenu_background</item>   
  </style>

drawable/my_mtrl_popupmenu_background.xml文件:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
  <solid android:color="?attr/colorSurface"/>

  <corners
      android:bottomLeftRadius="4dp"
      android:bottomRightRadius="4dp"
      android:topLeftRadius="4dp"
      android:topRightRadius="4dp"/>

</shape>

在原始文件中有一个名为“padding”的标签:
<shape xmlns:android="http://schemas.android.com/apk/res/android">
  <solid android:color="?attr/colorSurface"/>

  <corners
    ..../>

  <padding
      android:bottom="8dp"
      android:top="8dp"/>

</shape>

在这里输入图片描述

要创建弹出框,您可以使用以下代码:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
   <item name="popupMenuStyle">@style/popupMenu</item>
</style>

<style name="popupMenu" parent="@style/Widget.MaterialComponents.PopupMenu">
    <item name="android:popupBackground">@drawable/my_mtrl_popupmenu_background</item>   
</style>

嗯,除非我将主活动的主题更改为:<item name="popupMenuStyle">@style/popup</item>,否则它似乎对我不起作用,但这会删除我的弹出菜单锚点。我忘了提到我以编程方式填充菜单! - DIRTY DAVE
1
@davids 对不起,我想错了。我只考虑了 OverflowMenu。我刚刚为一个简单的弹出式菜单添加了样式。 - Gabriele Mariotti
没问题!你的弹出窗口的方法完美运行。谢谢! - DIRTY DAVE
1
在主题中仅使用了 android 前缀来处理弹出菜单:android:popupMenuStyle - Artem Mostyaev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接