如何让溢出弹出菜单避免遮挡操作栏?

9

背景

我的应用程序上,当我更新到新的支持库并尝试在Lollipop上使用时,我注意到一个奇怪的问题:当单击操作栏的溢出按钮(甚至是新的工具栏类)时,会在操作栏顶部显示弹出菜单,隐藏其他操作项,如下所示:

这里,被隐藏的操作项是卸载和共享。

问题

我已经尝试了通过覆盖溢出菜单的样式来避免这个问题,但什么都没有帮助。

不仅如此,这似乎是一种有意的行为,然而,在许多更新到具有材料设计的Google应用程序中,这种行为并不成立,就像我在这里报告的那样。

我的尝试

我尝试在我使用的主题中创建这个。实际上,我的主题非常不同,它的父类是“Theme.AppCompat.Light.NoActionBar”(我使用Toolbar作为ActionBar),但是这个片段也有这个问题,所以我认为如果一个问题解决了,另一个问题也会解决。

无论如何,这是代码片段:

<resources xmlns:tools="http://schemas.android.com/tools">

    <style name="AppBaseTheme" parent="Theme.AppCompat.Light"></style>

    <style name="AppTheme" parent="AppBaseTheme">
        <item name="android:actionOverflowMenuStyle" tools:targetApi="21">@style/OverflowMenu</item>
    </style>

    <style name="OverflowMenu" parent="@android:style/Widget.Material.PopupMenu.Overflow" tools:targetApi="21">
        <item name="android:overlapAnchor">false</item>
        <item name="android:dropDownVerticalOffset">50dip</item>
    </style>

</resources>

这两个属性都没有改变任何东西。

我也试图查找支持库中的工作原理,但找不到。

问题

如何使溢出操作项的弹出菜单避免隐藏其他项?


1
Material主题(与Material设计不同)和AppCompat遵循设计文档中规定的标准。具体来说,违反设计指南是它们都不允许你做的事情。 - ianhanniballake
1
你是否正在为你的应用主题扩展AppCompat? - alanv
1
另外,顺便提一下,作为编写Material Design样式和主题的Android框架工程师,我可以向您保证默认的重叠行为是正确的。 - alanv
@alanv 我已经尝试过AppCompat主题和Material主题。两者都存在这些问题,我也尝试在两者上设置属性。你说的“默认的重叠行为是正确的”是什么意思?请解释一下为什么你认为它更好,因为我已经写了多个理由说明它的错误之处(在这篇帖子上:https://code.google.com/p/android-developer-preview/issues/detail?id=1951),而且正如我预料的那样,它会导致用户意外选择。此外,Google似乎并没有遵循这个规则,所以使用以前的行为是有道理的。 - android developer
1
你能否在你的应用主题中包含一个XML片段?如果你的目标是Material并且使用内置的ActionBar,那么你发布的XML应该可以工作。 - alanv
显示剩余7条评论
1个回答

22

如果你正在使用ActionBarActivity,你需要覆盖appcompat版本的溢出菜单样式以及适用的弹出属性的appcompat版本。

<resources>
    <style name="AppBaseTheme" parent="Theme.AppCompat.Light" />

    <style name="AppTheme" parent="AppBaseTheme">
        <item name="actionOverflowMenuStyle">@style/OverflowMenu</item>
    </style>

    <style name="OverflowMenu" parent="Widget.AppCompat.PopupMenu.Overflow">
        <!-- Required for pre-Lollipop. -->
        <item name="overlapAnchor">false</item>

        <!-- Required for Lollipop. -->
        <item name="android:overlapAnchor">false</item>
    </style>

</resources>

这个有效。谢谢。我猜我离答案并不远... :) - android developer
不幸的是,当覆盖appcompat样式和主题时仍需要很多猜测和尝试。未来应该会更容易些。 - alanv
说,它也可以在运行时设置吗? - android developer
不,但它是PopupWindow的一个属性,由PopupMenu包装了几层,无论如何都无法访问。 - alanv
如果您收到"Target Api warning like: android:overlapAnchor needs Api 21"的警告,請實現[此答案(https://dev59.com/t2Up5IYBdhLWcg3wVWiv#18216531)]。 - Beytan Kurt
显示剩余2条评论

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