有没有一种相对直接的方法来实现这一目标?
是的当然。而且,它只需要 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。
您在屏幕截图中看到的并不完全是一个Menu,而是一个FrameLayout带有阴影的背景。这只是一个自定义 View。
所以你可以做同样的技巧,而不是膨胀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)
我希望,它有帮助
| 归档时间: |
|
| 查看次数: |
3920 次 |
| 最近记录: |