更改Android中溢出菜单的边距

时间:2016-01-15 04:50:28

标签: android

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

default position

然而,应用收件箱离屏幕的顶部和右边缘更远:

inbox

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

6 个答案:

答案 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>

结果:

<强>无样式:

enter image description here

<强>样式化

enter image description here

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

典型的应用主题设置是:

<强> /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。它只是自定义视图

enter image description here
您可以使用UI Automator Viewer

进行检查

所以你可以做同样的伎俩,而不是让PopupMenu充气,创建一个自定义View并将其放在任何你想要的地方。

如何归档与Menu

相同的行为

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

然后,取menu_dropdown_panel.9文件:

enter image description here

并在那里添加填充(我使用Paint.NET来执行此操作:调整画布大小,将旧图像插回并将黑色线条移动到画布的两侧):

enter image description here

在样式中将新背景设置为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>

结果如下所示:

enter image description here enter image description here
(垂直位置取决于您传递给PopupMenu构造函数的锚点)

要显示此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