答案 0 :(得分:3)
是否有相对直接的方法来实现这一目标?
是的,当然。而且,它只需要5行代码。
Konstantin Loginov采用自下而上的方法,在字面上处理代码/设计中的所有内容。尽管我很欣赏上述方法,但它会增加您的来源的复杂性。在使用自定义解决方案之前,最好先检查自上而下的方法是否可用。
这是自上而下的版本:
以下行将进入您的活动的基本主题定义:
<item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item>
样式OverflowMenuStyle
将定义为:
<style name="OverflowMenuStyle" parent="Widget.AppCompat.PopupMenu.Overflow">
<item name="android:dropDownHorizontalOffset">-16dp</item>
<item name="android:dropDownVerticalOffset">16dp</item>
</style>
结果:
<强>无样式:强>
<强>样式化强>
附加说明(对您来说可能是微不足道的,但也可能对其他人有所帮助):
典型的应用主题设置是:
<强> /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 />
<强> /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 />
在此类设置中,actionOverflowMenuStyle
将在BaseTheme
下定义。请注意,缺少android:
前缀 - 我们将覆盖appcompat库提供的actionOverflowMenuStyle
,而不是android系统。
答案 1 :(得分:2)
您在屏幕截图中看到的不完全是Menu
,而是带有阴影背景的FrameLayout
。它只是自定义视图。
您可以使用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>
结果如下所示:
要显示此PopupMenu
,我使用以下代码:
PopupMenu popup = new PopupMenu(MainActivity.this, fab);
popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
popup.show();
我希望,这有帮助
答案 2 :(得分:1)
你可以通过这个解决方案摆脱这些问题,但是它不会覆盖菜单,而是会像菜单按钮下方一样,如果你想要的话,试试吧,
创建一种风格
<style name="OverflowMenu" parent="Widget.AppCompat.PopupMenu.Overflow" tools:targetApi="21">
<item name="overlapAnchor">false</item>
<!--<item name="dropDownVerticalOffset">?attr/actionBarSize</item>-->
<item name="android:overlapAnchor">false</item>
</style>
然后将其添加到您的基本风格
<item name="actionOverflowMenuStyle">@style/OverflowMenu</item>
答案 3 :(得分:1)
没有直截了当的方式。但是有一种方法可以模仿这种行为或产生一种幻觉。
this post已经回答了类似的问题。这是一个稍微不同的问题,但答案也可能符合您的目的。
您可以“作弊”而不是实际的溢出菜单 一点。在操作栏中有一个看起来像的图标 溢出图标。您应该将
showAsAction
始终设置为此MenuItem
。单击溢出图标,显示ListPopupWindow
这是锚定到MenuItem
视图。如果ListPopupWindow
没有出现在你想要的地方,你可以打电话ListPopupWindow.setHorizontalOffset()
和ListPopupWindow.setVerticalOffset()
答案 4 :(得分:0)
这与默认的溢出菜单无关。我的猜测是,他们添加了一个自定义溢出按钮,用于打开具有透明根视图的自定义Activity(以覆盖ActionBar),并且,例如,可见部分的大小合适且位置CardView。 CardView正在处理边框和高程效果,但也可能是自定义的开场动画。这是定制工作。
答案 5 :(得分:0)
我认为这正是您所寻找的,您需要自定义视图
myTextView.linkTextAttributes = [NSForegroundColorAttributeName : UIColor.redColor(), NSFontAttributeName : textLinkFont, NSUnderlineStyleAttributeName : NSUnderlineStyle.StyleNone.rawValue]
了解更多信息this