2012-09-28 109 views
25

是否可以将弹出式菜单样式从白色背景上的默认黑色文本更改为黑暗背景,而无需将样式应用于整个活动(这打破了我的UI)?如何设计PopupMenu?

+0

我做的东西simil在这里! http://stackoverflow.com/questions/16621070/get-context-of-popupmenu-like-contextmenu – toobsco42

回答

3

是的,你可以

<style name="YOURSTYLE" parent="Widget.AppCompat.PopupMenu"> 
    <item name="android:textColor">@android:color/white</item> 
    <item name="android:itemBackground">@android:color/holo_red_light</item> 
</style> 

而且

Context wrapper = new ContextThemeWrapper(this, R.style.YOURSTYLE); 
PopupMenu popup = new PopupMenu(wrapper, view); 

结果

custom PopupMenu style in Android

42

您不能直接设置PopupMenu样式,但还有其他方法。

PopupMenu创建方式如下:

PopupMenu popupMenu=new PopupMenu(context, anchorView); 

菜单的样式由上下文传递的风格决定的。所以你所要做的就是传递你的Activity参考作为上下文,菜单将被相应地设置。

如果要定义自己的风格,从默认的一个继承你的活动方式和覆盖以下项目:

<style name="style" parent="android:Theme.Holo.Light"> 
    <item name="android:popupMenuStyle">...</item> 
    <item name="android:popupAnimationStyle">...</item> 
    <item name="android:popupBackground">...</item> 
    <!-- etc etc --> 
</style> 
+4

什么值代替“....”。 我试过------------------------ @ android:color/holo_red_light - ----------------------------我在弹出菜单中看不到任何变化[我没有使用其他两个属性] - ---------------------- 而且我将这种风格分配为活动风格。请告诉我我做错了什么? – Santosh

+1

@Santosh checkout http://stackoverflow.com/questions/22320663/change-background-popupmenu-in-android –

28

添加到什么Deville建议,你也可以添加以下属性你的主题风格。

在我的XML样式定义在上面的样式定义

<style name="myPopupMenuStyle" parent="@style/Widget.AppCompat.Light.PopupMenu"> 

</style> 
<style name="myPopupMenuTextAppearanceSmall" parent="@style/TextAppearance.AppCompat.Light.Widget.PopupMenu.Small"> 
    <item name="android:textColor">#000000</item> 
</style> 
<style name="myPopupMenuTextAppearanceLarge" parent="@style/TextAppearance.AppCompat.Light.Widget.PopupMenu.Large"> 
    <item name="android:textColor">#000000</item> 
</style> 

引用你会发现程序兼容性

<style name="style" parent="android:Theme.Holo.Light">   
    <!-- other attributes --> 
    <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> 

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

其他风格,那是因为我使用的是Android的支持库目标下的Android API级别。

+0

你知道我怎样才能改变使用支持库的弹出菜单的背景颜色? thx – Sandra

+0

这将删除弹出框的边框。 – AndroidDev

+0

这个工程,但我改变了我的最低SDK从10到11 –

6

使用ActionBar的同样情况下创建PopupMenu

actionBar.getThemedContext()

所以,

ActionBar actionBar = ((ActionBarActivity) getActivity()).getSupportActionBar(); 
PopupMenu popMenu = new PopupMenu(actionBar.getThemedContext(), someView); 
+1

你假设使用Actionbar。弹出窗口可以在没有操作栏的情况下使用。 – AndroidDev

+0

即使使用工具栏,如果它设置为支持Actionbar,它也可以很好地工作。谢谢。 – buggydroid

9

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

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

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

启用图标的这种实现方式并不适用于我,所以请参阅本文后面的dgtale的回答:http://stackoverflow.com/questions/6805756/is-it-possible-to-display-icons-in-a-popupmenu – Ivan