CAB溢出菜单自定义样式

在我的应用程序中,我正在显示一个上下文操作栏,因为我没有空间来执行所有操作,其中一些操作可以通过溢出菜单button进行访问。 现在我想要设置溢出菜单并更改其背景。 我的主题从Theme.AppCompatinheritance,我定义了这些样式:

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

我的应用程序中的其他菜单(操作栏和其他菜单中的溢出菜单)是样式的,但上下文操作栏的溢出菜单不是。 我该怎么办?

Solutions Collecting From Web of "CAB溢出菜单自定义样式"

要更改溢出菜单背景,您需要覆盖属性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> 

可绘制的bg_cab_popup可以是任何types的drawable。 但是,使用9补丁是有道理的。

如果您需要更改背景以外的任何内容,请留下评论。

我终于有了一个解决scheme。 看来你需要添加到你的主题:

 <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属性可以接受任何你喜欢的颜色值,并且你可以使用上下文动作button的溢出菜单。

我将假设您使用的是最新的(21.xx)appcompat-v7库,并添加了新的Toolbar小部件。 要实现你想要的,你不要修改你的主应用程序主题(文本select操作模式除外),而是将风格应用到布局中的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是最重要的属性。 它指向另一个样式定义,它将描述工具栏的popup式菜单的外观。

 <style name="ThemeOverlay.YourApp" parent="ThemeOverlay.AppCompat"> <item name="android:colorBackground">#f00</item> <item name="android:textColor">#ff0</item> </style> 

重要提示:请注意,您将以此作为主题而不是风格 。 当您应用样式时,属性仅设置您指定的一个布局元素 。 当你应用一个主题时,这些属性会传播给它的所有孩子 。 这就是为什么在使用主题时,你绝对不要重写background (这会导致透支和不期望的外观),而是倾向于windowBackgroundcolorBackground (仅适用于相关的顶层元素)等更具体的属性。

为了完成这个例子,我还会包含一个工具栏主题:

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

请记住:使用自定义文本颜色时,请使用select器并定义禁用的颜色(如果您在button或菜单上使用颜色,则双倍使用)。

编辑

上述解决scheme据说不适用于上下文操作栏或动作模式popup窗口。 我发现它是由活动主题上定义的以下属性控制的:

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

创build一个基于Widget.PopupWindow的自定义样式,并从actionModePopupWindowStyle指向它。