在我的应用程序中,我正在显示一个上下文操作栏,因为我没有空间进行所有操作,其中一些操作在溢出菜单按钮下访问。现在我想设置溢出菜单的样式并更改其背景。我的主题继承自Theme.AppCompat,我定义了这些样式:
<item name="android:popupMenuStyle">@style/PopupMenu</item>
<item name="android:listPopupWindowStyle">@style/PopupMenu</item>
<item name="android:dropDownListViewStyle">@style/DropDownListView</item>
<style name="PopupMenu" parent="Widget.AppCompat.PopupMenu">
<!--<item name="android:popupBackground">@color/dark_color</item>-->
<item name="android:textColor">?android:textColorPrimary</item>
<item name="android:dropDownSelector">?popupItemBackground</item>
</style>
<style name="DropDownListView" parent="Widget.AppCompat.ListView.DropDown">
<item name="android:listSelector">?popupItemBackground</item>
<item name="android:divider">@null</item>
<item name="android:dividerHeight">0dp</item>
</style>
我的应用程序中的其他菜单(操作栏和其他中的溢出菜单)是样式化的,但上下文操作栏的溢出菜单不是。我该怎么办?
答案 0 :(得分:2)
要更改溢出菜单背景,您需要覆盖属性actionOverflowMenuStyle
:
<!-- add to your parent style -->
<item name="actionOverflowMenuStyle">@style/LStyled.PopupMenu.OverflowMenu</item>
<style name="LStyled.PopupMenu.OverflowMenu" parent="@style/Widget.AppCompat.PopupMenu.Overflow">
<!-- 'overlapAnchor' changes position of the popup -->
<!-- true - popup will be shown over the overflow button -->
<!-- false - popup will be shown below the overflow button -->
<item name="overlapAnchor">false</item>
<item name="android:popupBackground">@drawable/bg_cab_popup</item>
</style>
Drawable bg_cab_popup
可以是任何类型的drawable。但是,使用9补丁是有道理的。
如果您需要更改背景以外的任何内容,请给我留言。
答案 1 :(得分:2)
我终于找到了解决方案。您似乎需要将此添加到您的主题:
<item name="actionBarPopupTheme">@style/ThemeOverlay.My</item>
其中:
<style name="ThemeOverlay.My" parent="ThemeOverlay.AppCompat">
<item name="android:colorBackground">@color/my_theme_background</item>
</style>
colorBackground属性可以采用您喜欢的任何颜色值,并且您可以使用上下文操作按钮的溢出菜单设置样式。
答案 2 :(得分:0)
我将假设您正在使用最新的(21.x.x)appcompat-v7库并添加了新的Toolbar
小部件。要实现您的目标,请不要修改主应用主题(文本选择操作模式除外),而是将样式应用于布局中的Toolbar
元素(style="@style/Widget.YourApp.Toolbar"
)。样式定义可能类似于:
<style name="Widget.YourApp.Toolbar" parent="Widget.AppCompat.Toolbar">
<item name="android:background">#111</item>
<item name="android:elevation" tools:ignore="NewApi">8dp</item>
<item name="theme">@style/ThemeOverlay.YourApp.ActionBar</item>
<item name="popupTheme">@style/ThemeOverlay.YourApp</item>
</style>
对于您要实现的目标,popupTheme
是最重要的属性。它指向另一个样式定义,它将描述工具栏弹出菜单的外观。
<style name="ThemeOverlay.YourApp" parent="ThemeOverlay.AppCompat">
<item name="android:colorBackground">#f00</item>
<item name="android:textColor">#ff0</item>
</style>
重要提示:请注意,您将其用作主题而不是样式。应用样式时,属性仅设置为一个布局元素,您可以在其中指定。应用主题时,属性会传播到其所有子项。这就是为什么在使用主题时,你永远不会覆盖background
(这会导致过度绘制和不受欢迎的外观),而是支持更具体的属性,例如windowBackground
或colorBackground
(仅适用于相关的顶级元素) )。
为了使这个例子完整,我还将包括一个工具栏主题:
<style name="ThemeOverlay.YourApp.ActionBar" parent="ThemeOverlay.AppCompat.ActionBar">
<!-- these color action bar title and subtitle -->
<item name="android:textColorPrimary">#00f</item>
<item name="android:textColorSecondary">#0ff</item>
<!-- this colors the icons (apply manual tinting for non-appcompat icons programmatically) -->
<item name="colorControlNormal">#0f0</item>
<!-- bug in the library - the overflow icon on Lollipop will now respect the above -->
<item name="android:colorControlNormal" tools:ignore="NewApi">?colorControlNormal</item>
<!-- these color the text of action items -->
<item name="actionMenuTextColor">?colorControlNormal</item>
</style>
请记住:使用自定义文字颜色时,请使用选择器并定义禁用的颜色(如果您在按钮或菜单中使用颜色,则加倍)。
上述解决方案据说不适用于上下文操作栏或操作模式弹出窗口。我发现它是由活动主题上定义的以下属性控制的:
<item name="actionModePopupWindowStyle">?attr/popupWindowStyle</item>
默认值指向@style/Widget.PopupMenu
,其定义如下:
<style name="Widget.PopupWindow">
<item name="popupBackground">@drawable/editbox_dropdown_background_dark</item>
<item name="popupAnimationStyle">@style/Animation.PopupWindow</item>
</style>
根据Widget.PopupWindow
创建自定义样式,并从actionModePopupWindowStyle
指向它。