CAB溢出菜单自定义样式

时间:2014-12-17 11:00:08

标签: android contextual-action-bar

在我的应用程序中,我正在显示一个上下文操作栏,因为我没有空间进行所有操作,其中一些操作在溢出菜单按钮下访问。现在我想设置溢出菜单的样式并更改其背景。我的主题继承自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>

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

3 个答案:

答案 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(这会导致过度绘制和不受欢迎的外观),而是支持更具体的属性,例如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>

请记住:使用自定义文字颜色时,请使用选择器并定义禁用的颜色(如果您在按钮或菜单中使用颜色,则加倍)。

修改

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

<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指向它。