更改Android中溢出菜单的边距

esp*_*chi 5 android

这是Android中上下文菜单的默认位置:

默认位置

但是,应用程序收件箱距离屏幕的顶部和右侧边缘更远:

收件箱

是否有相对直接的方法来实现这一目标?

Vik*_*ram 5

有没有一种相对直接的方法来实现这一目标?

是的当然。而且,它只需要 5 行代码。

Konstantin Loginov采用自下而上的方法,您可以真正处理代码/设计中的所有内容。尽管我很欣赏上述方法,但它增加了您的来源的复杂性。在诉诸自定义解决方案之前,最好先检查自上而下的方法是否可用。

这是自顶向下的版本:

以下行将进入您的活动的基本主题定义:

<item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item>
Run Code Online (Sandbox Code Playgroud)

样式OverflowMenuStyle将定义为:

<style name="OverflowMenuStyle" parent="Widget.AppCompat.PopupMenu.Overflow">
    <item name="android:dropDownHorizontalOffset">-16dp</item>
    <item name="android:dropDownVerticalOffset">16dp</item>
</style>
Run Code Online (Sandbox Code Playgroud)

结果:

无样式:

在此处输入图片说明

风格:

在此处输入图片说明

附加说明(对您来说可能微不足道,但可能对其他人有帮助):

典型的应用程序主题设置是:

/res/values/styles.xml:

<!-- Values defined here apply to all supported API versions unless overridden in children -->
<BaseTheme />

<!-- Defined values apply to all supported API versions unless overridden in res/values-vXX/styles.xml -->
<AppTheme extends BaseTheme />
Run Code Online (Sandbox Code Playgroud)

/res/values-vXX/styles.xml:

<!-- Values defined here apply to all API versions >= XX unless overridden in res/values-vYY/styles.xml where YY > XX -->
<AppTheme extends BaseTheme />
Run Code Online (Sandbox Code Playgroud)

在这种设置中,actionOverflowMenuStyle将在BaseTheme. 请注意没有android:前缀 - 我们覆盖的actionOverflowMenuStyle是 appcompat 库提供的,而不是 android system


Kon*_*nov 2

关于收件箱应用程序

您在屏幕截图中看到的并不完全是一个Menu,而是一个FrameLayout带有阴影的背景。这只是一个自定义 View

在此输入图像描述
您可以使用UI Automator Viewer 检查它

所以你可以做同样的技巧,而不是膨胀PopupMenu,创建一个自定义View并将其放置在你想要的任何地方。

如何将相同的行为存档为Menu

首先,使用Android Action Bar Style Generator生成弹出菜单的背景(或自己创建 9patch 背景)。

然后,获取menu_dropdown_panel.9文件:

在此输入图像描述

并在那里添加填充(我使用 Paint.NET 来做到这一点:调整画布大小,插入旧图像并将黑线移动到画布的两侧):

在此输入图像描述

设置新背景,如android:popupBackground样式所示:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="popupMenuStyle">@style/PopupMenu.Example</item>
</style>

<style name="PopupMenu.Example" parent="@style/Widget.AppCompat.Light.PopupMenu">
    <item name="android:popupBackground">@drawable/menu_dropdown_panel_background</item>
</style>
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此输入图像描述在此输入图像描述
(垂直位置取决于您传递给 的PopupMenu构造函数的锚点)

为了展示这一点PopupMenu,我使用以下代码:

PopupMenu popup = new PopupMenu(MainActivity.this, fab);
popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
popup.show();
Run Code Online (Sandbox Code Playgroud)

我希望,它有帮助