【问题标题】:How to style PopupMenu?如何设置 PopupMenu 的样式?
【发布时间】:2012-09-20 02:35:23
【问题描述】:

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

【问题讨论】:

标签: android user-interface


【解决方案1】:

是的,你可以

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

结果

【讨论】:

  • 如何减少弹出菜单的宽度
  • 这会消除菜单项的涟漪效应,有什么办法可以保留吗?
  • 不适用于浅色/深色主题。
【解决方案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);

【讨论】:

  • 我发现了很多“解决方案”,每一个都比另一个更复杂。但这一个是直截了当且最有用的。非常感谢。
【解决方案3】:

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

actionBar.getThemedContext()

所以,

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

【讨论】:

  • 您假设使用了操作栏。弹出窗口可以在没有操作栏的情况下使用。
  • 如果工具栏设置为支持Actionbar,即使工具栏也能很好地工作。谢谢。
【解决方案4】:

除了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 级别。

【讨论】:

  • 您知道如何使用支持库更改弹出菜单的背景颜色吗?谢谢
  • 这会移除弹出框周围的边框。
  • 这行得通,但我将最小 sdk 从 10 更改为 11
【解决方案5】:

你不能直接设置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>

【讨论】:

  • 要设置哪些值来代替“....”。我试过------------ ​​@android:color/holo_red_light ---- --------------------------我在弹出菜单中看不到任何变化[我没有使用其他两个属性]--- -------------------- 我将活动风格指定为这种风格。请告诉我我做错了什么?
猜你喜欢
  • 1970-01-01
  • 2012-07-28
  • 2012-03-29
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 2017-04-03
  • 2012-11-26
  • 1970-01-01
相关资源
最近更新 更多