如何使用Android> 4.0和硬件按钮在设备上的动作溢出菜单中设置文本样式?

时间:2013-01-07 09:05:39

标签: android drop-down-menu menu android-actionbar

我想自定义背景&我的溢出菜单的文字颜色。它适用于没有硬件菜单按钮的设备,但我无法使用硬件菜单按钮设置设备样式。请参见屏幕截图:

Screnshot from Galaxy Nexus Screenshot from 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>

6 个答案:

答案 0 :(得分:25)

我已经调查了这个问题。并且似乎无法使用硬件菜单键更改Android&gt; = 4.0设备的选项菜单textColor。甚至不改变一级,二级或三级颜色会影响文本颜色 我现在想到的唯一“解决方案”是使用java反射API。

但是,您可以将Android&gt; = 4.0 HW键设备的底部选项菜单的背景设置为与非HW键下拉菜单的背景分开。

您已经拥有非HW键下拉菜单的样式。非HW键下拉菜单由android:popupMenuStyle(和popupMenuStyle):

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

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

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

由于在Android&gt; = 4.0 HW键设备上更改底部选项菜单的文字颜色似乎有问题,我建议将此部分保留为默认样式。

答案 1 :(得分: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);
}

菜单打开时按菜单按钮会关闭它。

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

答案 2 :(得分:4)

您可以按照以下方式在Overflow MenuItem中应用样式和主题。 OverFlow菜单是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>

答案 3 :(得分: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>

答案 4 :(得分: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>

答案 5 :(得分:1)

如果你真的需要从右边图片更改菜单的文字颜色,你可以做什么可能是以下“黑客”:

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

我同意这不是最干净的方式(我会说这很难看,因为你必须在你有这样一个菜单的每个活动中注意并且每个菜单项的标题需要使用这个逻辑来改变)但是这是某种东西显示预期结果。 如果它对你有所帮助,请告诉我。

干杯!