在Android 5.0中如何设置弹出菜单的样式?

14

我正在为 Android 5.0 做准备,使用最新的兼容库,以下是我的样式。

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/theme_accent</item>
        <item name="colorAccent">@color/theme_accent_secondary</item>
    </style>

    <style name="AppThemeDark" parent="Theme.AppCompat">
        <item name="colorPrimary">@color/theme_accent</item>
        <item name="colorAccent">@color/theme_accent_secondary</item>
    </style>
</resources>

ActionBar的颜色是以编程方式设置的。

现在,我希望溢出/弹出菜单具有与Holo实现中相同的深色背景,但我无法使其正常工作,它看起来像这样:enter image description here

我尝试过设置popupMenuStyle,但没有效果。

如何让弹出菜单变暗?


你是如何创建带有图标的溢出菜单的? - user802421
溢出菜单的基本功能忽略图标。https://dev59.com/51TTa4cB1Zd3GeqPxfYA#5216625 - user802421
尝试这个:android:showAsAction="always" - animaonline
请查看以下链接以获取更好的解决方案:https://dev59.com/k14b5IYBdhLWcg3wdxcv - Apurva
5个回答

20

停止使用ActionBar。如果你想要一个像ActionBar一样设置的ToolBar,请按照android-developers博客上的这个指南操作。

它实际上在暗色操作栏(Dark Action Bar)中提到了你的用例,并提供了以下代码:

<android.support.v7.widget.Toolbar
    android:layout_height=”wrap_content”
    android:layout_width=”match_parent”
    android:minHeight=”@dimen/triple_height_toolbar”
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

为什么我要停止使用Actionbar呢?毕竟它并没有被弃用。 - animaonline
6
@animaonline 工具栏是操作栏的超集(简单地包装提取的布局)。你可以使用你已经做过的任何东西,还可以使用更多。操作栏将最终被替换。当前的支持库在支持旧的操作栏时存在相当多的错误,正如你可能已经注意到的那样。 - Derk-Jan
我知道这一点,我的应用程序非常复杂,有许多片段和自定义导航,ActionBar 很好地完成了工作,我不需要来自工具栏的任何新功能,所以我现在将坚持使用 ActionBar,我感谢您的推荐,但它们对我帮助不大。 - animaonline

11

这并非完整的答案,但是根据我的发现:

在过去的版本中,你需要指定一个可绘制对象(可查看https://github.com/StylingAndroid/StylingActionBar代码和教程)。

显然,现在这是一种颜色。要修改它,你需要指定以下主题:

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

    <style name="AppTheme" parent="android:Theme.Material.Light.DarkActionBar">
        <item name="android:actionBarPopupTheme">@style/popupNew</item>
    </style>

    <style name="popupNew" parent="android:ThemeOverlay.Material.Light">
        <item name="android:colorBackground">@color/red</item>
    </style>

</resources>

如果应用程序所应用的主题只是这个,那么它将正常工作。 但是,如果我在现有的主题中添加android:actionBarPopupTheme,它就无法正常工作。我正在尝试弄清楚为什么。


这个可以工作。但是如何修改操作栏弹出窗口的阴影? - Jonguo
正确的答案是你的主题调用了“actionBarPopupTheme”的样式,然后在样式中你必须添加“ThemeOverlay”的父级。我这样做了,它起作用了。谢谢你的回答! - Brandon

7
通过使用以下样式解决了我的问题:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/theme_accent</item>
    <item name="colorAccent">@color/theme_accent_secondary</item>
    <item name="actionBarStyle">@style/AbStyle</item>
    <item name="actionModeBackground">@color/actionmode_bg</item>
</style>

<style name="AbStyle" parent="Widget.AppCompat.Toolbar">
    <item name="elevation">2dp</item>
    <item name="displayOptions">homeAsUp|showTitle</item>
    <!--showHome-->
</style>

<style name="AppThemeDark" parent="Theme.AppCompat">
    <item name="colorAccent">@color/theme_accent_secondary</item>
    <item name="actionBarStyle">@style/AbStyle</item>
</style>

我必须使用Widget.AppCompat.Toolbar作为父actionBarStyle


6
请将属性popupTheme添加到您的工具栏中:
<android.support.v7.widget.Toolbar
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:id="@+id/toolbar"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:background="@color/color_primary"
  app:theme="@style/Theme.AppCompat.Light"
  app:popupTheme="@style/Theme.AppCompat" />

或者为您的工具栏定义一个新样式:
<style name="MyToolBarStyle" parent="Widget.AppCompat.Toolbar">
    <item name="android:background">@color/green</item>
    <item name="popupTheme">@style/Theme.AppCompat.Light</item>
    <item name="theme">@style/Theme.AppCompat</item>
</style>

1
我正在使用ActionBar,所以它并没有对我有太多帮助 :( - animaonline
你好,我们可以更改弹出菜单项的大小吗? - Mohammed Rampurawala

2
这个问题已经通过XML进行了样式处理,但是我在这里添加一些解释,说明如何自己解决此类样式问题。
首先,在使用AppCompat时,需要在应用程序的style.xml中将actionBarPopupTheme添加到主题中。
<style name="Theme.MyTheme" parent="@style/Base.Theme.AppCompat.Light.DarkActionBar">
    ...other stuff here

    <item name="actionBarPopupTheme">@style/Theme.MyTheme.ActionBarPopupTheme</item>
</style>

<style name="Theme.MyTheme.ActionBarPopupTheme" parent="@style/ThemeOverlay.AppCompat.Light">
    <item name="android:textColor">@android:color/white</item>
    <item name="android:background">@android:color/black</item>
</style>

以下是我采取的步骤,以得出这个解决方案(需要进行一些侦探工作,因为Android文档很差):
打开Android Studio中你的App的style.xml文件, 在定义你的App主题的那一行,将光标放在父主题上(例如,在@style/Base.Theme.AppCompat.Light.DarkActionBar中点击),然后按F4。这会带你到appcompat库中该样式的源代码。 在这个样式中,我看到了这一行: < item name="actionBarPopupTheme">@style/ThemeOverlay.AppCompat.Light< /item> 这看起来像是更改弹出窗口主题的可能位置。我在Android开发者文档中搜索了“actionBarPopupTheme”,找到了“引用应该用于填充操作栏小部件中显示的弹出窗口的主题”。所以这值得尝试。 我将包含“actionBarPopupTheme”的appcompat行复制到我的style.xml中,然后在此行中用Theme.MyTheme.ActionBarPopupTheme替换了项的主题引用(上面粗体部分)。 在我的style.xml中,我创建了名为Theme.MyTheme.ActionBarPopupTheme的新样式。我使用了从appcompat源中复制的样式使用的相同父级(上面粗体部分)。 为确保我的新弹出窗口样式正常工作,我将父样式更改为ThemeOverlay.AppCompat.Dark,然后在设备上运行和测试代码。弹出窗口样式已更改,因此现在我知道覆盖actionBarPopupTheme是正确的做法。然后我又改回了ThemeOverlay.AppCompat.Light。 下一个挑战是找出在Theme.MyTheme.ActionBarPopupTheme中要覆盖的项名称。我更改了文本和背景颜色。在某些情况下,查找更改某些东西的样式项名称可能会很棘手。找到较不明显的样式项名称的一种方法是查看appcompat xml文件中的样式定义(在上述第2步中按F4),不断进入父样式(再次按F4!),直到找到可能做你想要的事情的东西。Google搜索也会有所帮助。

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