49

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

4

5 回答 5

77

是的你可以

<style name="YOURSTYLE.PopupMenu" 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);
PopupMenu popup = new PopupMenu(wrapper, view);

结果

Android中的自定义PopupMenu样式

于 2018-01-09T03:25:10.707 回答
45

您不能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>
于 2013-01-11T21:00:33.717 回答
35

除了Deville建议的内容之外,您还可以将以下属性添加到您的主题样式中。

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

上述样式定义中引用的其他样式

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

您会在我的 xml 样式定义中注意到AppCompat,这是因为我正在使用 android 支持库来定位较低的 android API 级别。

于 2013-12-22T14:57:20.850 回答
6

使用相同的上下文ActionBar来创建PopupMenu

actionBar.getThemedContext()

所以,

ActionBar actionBar = ((ActionBarActivity) getActivity()).getSupportActionBar();
PopupMenu popMenu = new PopupMenu(actionBar.getThemedContext(), someView);
于 2014-12-06T05:43:45.583 回答
2

我的弹出菜单样式与其他样式略有不同。

所以,我创造了一种风格

<style name="AppTheme.PopupMenu" parent="Widget.AppCompat.PopupMenu">
    <item name="android:textColor">@color/textContrast</item>
    <item name="android:textColorSecondary">@color/text</item>
</style>

我正在使用工具栏

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

并设置这样的弹出样式

toolbar.setPopupTheme(R.style.AppTheme_PopupMenu);
于 2019-11-19T06:26:30.793 回答