2014-07-09 113 views
21

我需要更改一个popuo菜单的文本颜色,但我没有找到任何方法来做到这一点,我可以改变popmenu的背景,但不是文本,我编辑style.xml这样:android弹出菜单文本颜色(AppCompat)

<style name="AppBaseTheme" parent="Theme.AppCompat.Light"> 
    <!-- API 14 theme customizations can go here. --> 

    <item name="popupMenuStyle">@style/MyPopupMenu</item> 
    <item name="android:textAppearanceLargePopupMenu">@style/myPopupMenuTextAppearanceLarge</item> 
    <item name="android:textAppearanceSmallPopupMenu">@style/myPopupMenuTextAppearanceSmall</item> 
</style> 

<style name="MyPopupMenu" parent="@style/Widget.AppCompat.PopupMenu"> 
    <item name="android:popupBackground">#0F213F</item> 
</style> 

<style name="myPopupMenuTextAppearanceSmall" parent="@style/TextAppearance.AppCompat.Base.Widget.PopupMenu.Small"> 
    <item name="android:textColor">#ffffff</item> 
</style> 

<style name="myPopupMenuTextAppearanceLarge" parent="@style/TextAppearance.AppCompat.Base.Widget.PopupMenu.Large"> 
    <item name="android:textColor">#ffffff</item> 
</style> 

哪里出错?

+0

定义你的风格在AppTheme,而不是AppBaseTheme。 AppBaseTheme默认具有API级别11和14的自己的实现,它重新定义了您的样式。 – Ganster41

+0

[How to style PopupMenu?](http://stackoverflow.com/questions/12636101/how-to-style-popupmenu) –

+0

@ArtjomB。有些重叠但不重复,因为这个问题是关于AppCompat弹出窗口的。 –

回答

21
<item name="textAppearanceLargePopupMenu">@style/TextAppearance.AppCompat.Light.Widget.PopupMenu.Large</item> 
<item name="textAppearanceSmallPopupMenu">@style/TextAppearance.AppCompat.Light.Widget.PopupMenu.Small</item> 

我认为你正在使用TextAppearance.AppCompat.Base.Widget.PopupMenu。这是错误,您正在使用另一个不响应当前样式的父项。

你必须使用:

TextAppearance.AppCompat.Light.Widget.PopupMenu。

+1

这是什么意思?你是否可以编辑它,以便OP所做的任何事情都可以合并到你想要解决问题的任何事情上? – bharal

+0

我不能改变字体颜色。你可以更新到完整答案所有需要的风格。 –

+0

这就是我根据这个答案所做的,它为我工作,谢谢Alfaplus! <样式名称= “OverflowMenuText” 父= “TextAppearance.AppCompat.Light.Widget.PopupMenu.Large”> <项目名称= “机器人:文字颜色”> @色/ colorToolbarText –

30

在styles.xml

<style name="itemTextStyle.AppTheme" parent="@android:style/TextAppearance.Widget.IconMenu.Item"> 
     <item name="android:textColor">@drawable/color_item_popup</item> 
     <item name="android:textSize">@dimen/text_content</item> 
    </style> 

,并添加AppTheme

<item name="android:itemTextAppearance">@style/itemTextStyle.AppTheme</item> 

color_item_popup.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" android:color="@color/primary_text"/> 
    <item android:state_focused="true" android:color="@color/primary_text"/> 
    <item android:color="@color/secondary_text"/> 
</selector> 
+1

作品与appcompatibility弹出菜单 –

+2

这有是正确的答案。 –

+0

它适合我! – Werb

1

可以很明显的定制的弹出菜单以自己的方式。它非常简单。但首先你需要照顾一件非常重要的事情。

的弹出菜单是这样的创建,

PopupMenu popupMenu = new PopupMenu(context, anchorView); 

现在的“语境”在这里扮演的造型非常重要的作用。 PopupMenu的风格取决于您传递的上下文的样式。所以要非常小心。我几乎花了半小时才弄清楚这一点。

如果你在一个片段只是通过“getActivity()”,你就完成了。

造型的弹出菜单项

只是覆盖在你的风格以下项目,

<item name="textAppearanceLargePopupMenu">@style/myPopupMenuTextAppearanceLarge</item> 
<item name="android:textAppearanceLargePopupMenu">@style/myPopupMenuTextAppearanceLarge</item> 

<item name="textAppearanceSmallPopupMenu">@style/myPopupMenuTextAppearanceSmall</item> 
<item name="android:textAppearanceSmallPopupMenu">@style/myPopupMenuTextAppearanceSmall</item> 

和定制你想要的文本外观,

<style name="myPopupMenuTextAppearanceSmall" parent="@style/TextAppearance.AppCompat.Light.Widget.PopupMenu.Small"> 
      <item name="android:textColor">@color/text_hint_color</item> 
</style> 

<style name="myPopupMenuTextAppearanceLarge" parent="@style/TextAppearance.AppCompat.Light.Widget.PopupMenu.Large"> 
      <item name="android:textColor">@color/text_hint_color</item> 
</style> 

如果你想改变PopupMenu的背景,这样做

<item name="popupMenuStyle">@style/myPopupMenuStyle</item> 
    <item name="android:popupMenuStyle">@style/myPopupMenuStyle</item> 

高级造型

的弹出菜单项不支持默认显示的图标。但显示图标可以使它看起来好多了。我建议尝试一下。

为了实现这个刚刚把下面的代码在你的活动,你是好去,

@Override 
    public boolean onMenuOpened(int featureId, Menu menu) { 
     if (featureId == Window.FEATURE_ACTION_BAR && menu != null) { 
      if (menu.getClass().getSimpleName().equals("MenuBuilder")) { 
       try { 
        Method m = menu.getClass().getDeclaredMethod(
          "setOptionalIconsVisible", Boolean.TYPE); 
        m.setAccessible(true); 
        m.invoke(menu, true); 
       } catch (NoSuchMethodException e) { 
        Log.e("tag", "onMenuOpened", e); 
       } catch (Exception e) { 
        throw new RuntimeException(e); 
       } 
      } 
     } 
     return super.onMenuOpened(featureId, menu); 
    } 

希望它能帮助。

+0

请使用您的重复标志,而不是发布完全相同的答案多个问题(我已经投票结束这个问题)。如果问题不重复,那么您必须调整您的答案以符合问题。 –

+0

android:textAppearance_PopupMenu在nexus9上工作,但不在nexus7-2012上工作;添加textAppearance_PopupMenu没有“android:”,它的工作原理;谢谢 – mjollneer

12

风格。XML:

<style name="PopupMenu" parent="Widget.AppCompat.PopupMenu.Overflow"> 
    <item name="android:popupBackground">@color/white</item> 
</style> 

在java中:

Context wrapper = new ContextThemeWrapper(getContext(), R.style.PopupMenu); final PopupMenu popupMenu = new PopupMenu(wrapper, view);

+0

这正是需要的。谢谢。 – superbre

+0

这应该是公认的答案 –

+0

谢谢。这就对了! – Rainmaker