如何设置PopupMenu的样式?

Vio*_*ffe 37 user-interface android

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

Fra*_*yen 45

是的你可以

<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>
Run Code Online (Sandbox Code Playgroud)

Context wrapper = new ContextThemeWrapper(this, R.style.YOURSTYLE);
PopupMenu popup = new PopupMenu(wrapper, view);
Run Code Online (Sandbox Code Playgroud)

结果

Android中的自定义PopupMenu样式

  • 我们如何减少弹出菜单的宽度 (4认同)
  • 不适用于浅色/深色主题。 (2认同)

And*_*nko 42

您无法PopupMenu直接设置样式,但还有其他方法.

PopupMenu 按以下方式创建:

PopupMenu popupMenu=new PopupMenu(context, anchorView);
Run Code Online (Sandbox Code Playgroud)

菜单的风格取决于您传递的上下文风格.所以你需要做的就是将你的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>
Run Code Online (Sandbox Code Playgroud)

  • 设置什么值代替"......".我试过------------------------ <item name ="android:popupBackground"> @ android:color/holo_red_light </ item> ---- --------------------------我的弹出菜单中没有任何变化[我没有使用其他两个属性] --- --------------------我正在将活动样式指定为此样式.请告诉我,我做错了什么? (4认同)

Jim*_*loa 33

除了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>
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

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


Ari*_*Roy 9

显然,您可以用自己的方式自定义PopupMenu.它很简单.但首先你需要照顾一件非常重要的事情.

PopupMenu是这样创建的,

PopupMenu popupMenu = new PopupMenu(context, anchorView);
Run Code Online (Sandbox Code Playgroud)

现在,"背景"在造型中起着非常重要的作用.PopupMenu的样式取决于您传递的上下文的样式.所以要非常小心.我浪费了差不多一半时间搞清楚这一点.

如果你在一个片段中,只需传递"getActivity()"就可以了.

PopupMenu项目的样式

只需覆盖您的风格中的以下项目,

<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>
Run Code Online (Sandbox Code Playgroud)

并根据需要自定义文本外观,

<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>
Run Code Online (Sandbox Code Playgroud)

如果要更改PopupMenu的背景,请执行此操作

<item name="popupMenuStyle">@style/myPopupMenuStyle</item>
    <item name="android:popupMenuStyle">@style/myPopupMenuStyle</item>
Run Code Online (Sandbox Code Playgroud)

高级造型

PopupMenu项目不支持默认显示图标.但是显示图标可以使它看起来更好.我建议尝试一下.

要实现这一点,只需在您的活动中添加以下代码,您就可以了,

@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);
}
Run Code Online (Sandbox Code Playgroud)

希望它能帮到你们所有人.谢谢.


Gui*_*hgo 6

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

actionBar.getThemedContext()

所以,

ActionBar actionBar = ((ActionBarActivity) getActivity()).getSupportActionBar();
PopupMenu popMenu = new PopupMenu(actionBar.getThemedContext(), someView);
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

66611 次

最近记录:

6 年,3 月 前