【问题标题】:How to make the overflow popup menu avoid obstructing the action bar?如何让溢出的弹出菜单不遮挡操作栏?
【发布时间】:2014-11-24 23:46:22
【问题描述】:

背景

my app 上,当我更新到新的支持库并尝试使用 Lollipop 时,我注意到一个奇怪的问题:单击操作栏的溢出按钮时(甚至是新的 Toolbar class) 将在操作栏顶部显示弹出菜单,隐藏其他操作项,例如:

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

问题

我试图通过覆盖溢出菜单的样式来避免这个问题,但没有任何帮助。

不仅如此,它似乎是an intentional behavior,但在许多更新为具有材料设计的谷歌应用程序中,这种行为并不成立,正如我报告的here

我尝试过的

我尝试在我使用的主题中创建它。其实我的主题很不一样,它的父是“Theme.AppCompat.Light.NoActionBar”(我使用工具栏作为actionBar),但是这个sn-p也有这个问题,所以我认为如果能解决其他人也会。

不管怎样,这是sn-p:

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

这两个属性都没有改变。

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

问题

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

【问题讨论】:

  • Material 主题(与 Material design 不同)和 AppCompat 遵循设计文档中规定的标准。特别是违反设计指南是不允许你做的事情。
  • @ianhanniballake 请阅读我写的所有内容。即使是 Google 的材料设计应用程序也无法做到这一点。此外,它还会导致其他人报告的其他问题(我已经警告过)。
  • 您是否正在为您的应用主题扩展 AppCompat?
  • 另外,请注意,作为编写 Material Design 样式和主题的 Android 框架工程师,我可以向您保证,默认的重叠行为是正确的。
  • 您能否为您的应用主题包含一个 XML 的 sn-p?如果您以 Material 为目标并使用内置的 ActionBar,那么您发布的 XML 应该可以工作。

标签: android android-actionbar android-5.0-lollipop material-design android-toolbar


【解决方案1】:

如果您使用的是 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>

【讨论】:

  • 这行得通。谢谢你。猜猜我离答案不远了...... :)
  • 不幸的是,在覆盖 appcompat 样式和主题时仍然需要进行大量猜测和检查。将来应该会变得更容易。
  • 说,是不是也可以在运行时设置?
  • 不,但它是 PopupWindow 的一个属性,它被 PopupMenu 包裹了好几层,无论如何都无法访问。
  • 太糟糕了。还是谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多