29

我想为我的溢出菜单自定义背景和文本颜色。它适用于没有硬件菜单按钮的设备,但我无法为带有硬件菜单按钮的设备设置样式。看截图:

Galaxy Nexus 截图 来自 Galaxy S3 的屏幕截图

我正在使用这些样式:

<style name="Theme.settleup" parent="@style/Theme.Sherlock.Light.DarkActionBar">
    <item name="android:popupMenuStyle">@style/settleup_PopupMenu</item> 
    <item name="android:actionMenuTextColor">@android:color/white</item>
</style>
<style name="settleup_PopupMenu" parent="@style/Widget.Sherlock.ListPopupWindow">
    <item name="android:popupBackground">@drawable/menu_dropdown_panel_settleup</item>
</style>
4

6 回答 6

26

我已经调查了这个问题。并且似乎无法textColor使用 HW 菜单键更改 Android >= 4.0 设备的选项菜单。甚至更改主要、次要或三次颜色都不会影响文本颜色。
我现在想到的唯一“解决方案”是对 java 反射 API 的一些非常讨厌的使用。

但是,您可以将 Android >= 4.0 硬件密钥设备的底部选项菜单的背景与非硬件密钥下拉菜单的背景分开设置。

您已经有了非硬件键下拉菜单的样式。非硬件键下拉菜单由android:popupMenuStyle(and popupMenuStyle) 定义:

<style name="Theme.settleup" parent="@style/Theme.Sherlock.Light.DarkActionBar">
    <item name="android:popupMenuStyle">@style/settleup_PopupMenu</item> 
</style>

但是 Android >= 4.0 HW 键底部选项菜单的背景是用android:panelBackground主题中的项目定义的:

<style name="Theme.settleup" parent="@style/Theme.Sherlock.Light.DarkActionBar">
    <item name="android:panelBackground">@drawable/mybackground</item>
</style>

由于在 Android >= 4.0 HW 关键设备上更改底部选项菜单的文本颜色似乎是一个问题,我建议将此部分保留为默认样式。

于 2013-01-23T03:13:06.660 回答
6

一直在挖掘 AppCompat 主题,但无论我尝试什么 textColor 仍然是白色的。我现在所做的只是手动弹出工具栏菜单,如下所示:

@Override
public boolean onKeyUp(int keycode, KeyEvent e) {
   switch (keycode) {
       case KeyEvent.KEYCODE_MENU:
           if ( getSupportActionBar() != null ) {
               getSupportActionBar().openOptionsMenu();

               return true;
           }
   }

   return super.onKeyUp(keycode, e);
}

在菜单打开时按下菜单按钮会神奇地关闭它。

谁需要丑陋的黑底对齐菜单呢?

于 2015-06-08T16:29:47.860 回答
4

您可以按以下方式在溢出菜单项中应用样式和主题。OverFlow Menu 是 ListView 所以,我们可以根据 listview 应用主题。

在styles.xml中应用以下代码

<style name="AppTheme" parent="@android:style/Theme.Holo.Light">
    <item name="android:dropDownListViewStyle">@style/PopupMenuListView</item>
            <item name="android:actionBarWidgetTheme">@style/PopupMenuTextView</item>
            <item name="android:popupMenuStyle">@style/PopupMenu</item>
            <item name="android:listPreferredItemHeightSmall">40dp</item>
    </style>

    <!-- Change Overflow Menu ListView Divider Property -->
        <style name="PopupMenuListView" parent="@android:style/Widget.Holo.ListView.DropDown">
            <item name="android:divider">@color/app_navigation_divider</item>
            <item name="android:dividerHeight">1sp</item>
            <item name="android:listSelector">@drawable/list_selector</item>
        </style>

        <!-- Change Overflow Menu ListView Text Size and Text Size -->
        <style name="PopupMenuTextView" parent="@android:style/Widget.Holo.Light.TextView">
            <item name="android:textColor">@color/app_white</item>
            <item name="android:textStyle">normal</item>
            <item name="android:textSize">18sp</item>
            <item name="android:drawablePadding">25dp</item>
            <item name="android:drawableRight">@drawable/navigation_arrow_selector</item>
        </style>

        <!-- Change Overflow Menu Background -->
        <style name="PopupMenu" parent="android:Widget.Holo.Light.ListPopupWindow">
            <item name="android:popupBackground">@drawable/menu_overflow_bg</item>
        </style>
于 2014-11-06T10:38:12.667 回答
3

对于AppCompat主题:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="actionBarPopupTheme">@style/HardwareOptionMenu</item>
</style>

<style name="HardwareOptionMenu" parent="ThemeOverlay.AppCompat.Dark">
    <item name="android:textColorSecondary">@color/white</item>
    <item name="android:colorBackground">@color/black</item>
</style>
于 2015-10-31T15:37:59.593 回答
1

如果您真的必须从右图更改菜单的文本颜色,您可以做的可能是以下“hack”:

SpannableStringBuilder text = new SpannableStringBuilder();
        text.append("MenuItem1");
        text.setSpan(new ForegroundColorSpan(Color.WHITE), 0, text.length(),
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        menu.add(Menu.NONE, MENU_ITEM_1, Menu.NONE, null).setTitle(text);

我同意这不是最干净的方式(我会说这很丑陋,因为您必须在每个拥有此类菜单的活动中注意,并且需要使用此逻辑更改每个菜单项的标题),但它可以显示预期结果。让我知道它是否对您有帮助。

干杯!

于 2013-01-29T12:09:21.067 回答
1

也尝试添加没有android前缀的项目

<style name="Theme.settleup" parent="@style/Theme.Sherlock.Light.DarkActionBar">
    <item name="android:popupMenuStyle">@style/settleup_PopupMenu</item>
    <item name="popupMenuStyle">@style/settleup_PopupMenu</item> 
    <item name="android:actionMenuTextColor">@android:color/white</item>
    <item name="actionMenuTextColor">@android:color/white</item>
</style>
<style name="settleup_PopupMenu" parent="@style/Widget.Sherlock.ListPopupWindow">
    <item name="android:popupBackground">@drawable/menu_dropdown_panel_settleup</item>
    <item name="popupBackground">@drawable/menu_dropdown_panel_settleup</item>
</style>
于 2013-01-07T09:26:39.640 回答