How to style PopupMenu?

AndroidUser Interface

Android Problem Overview


is it possible to change pop-up menu style from default black text on white background to dark background without applying style to the whole activity (which breaks my UI)?

Android Solutions


Solution 1 - Android

Yes, you can

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

And

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

Result

custom PopupMenu style in Android

Solution 2 - Android

You cannot set PopupMenu style directly, but there are other ways.

PopupMenu is created the following way:

PopupMenu popupMenu=new PopupMenu(context, anchorView);

The style of menu is determined by the style of context you pass. So all you need to do is to pass your Activity reference as context, and menu will be styled accordingly.

If you want to define the style yourself, inherit your activity style from one of the default ones and override the following items:

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

Solution 3 - Android

Adding to what Deville suggested, you can also add the following attributes to your theme 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>

Other styles referenced in the above style definition

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

You would notice AppCompat in my xml style definitions, that is because I am using the android support library to target lower android API Levels.

Solution 4 - Android

use the same context of the ActionBar to create the PopupMenu

actionBar.getThemedContext()

So,

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

Solution 5 - Android

I am styling popup menu a little bit differently than others.

So, I've created a style

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

And I'm using toolbar

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

And set popup style like this

toolbar.setPopupTheme(R.style.AppTheme_PopupMenu);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionViolet GiraffeView Question on Stackoverflow
Solution 1 - AndroidFrank NguyenView Answer on Stackoverflow
Solution 2 - AndroidAndrii ChernenkoView Answer on Stackoverflow
Solution 3 - AndroidJimmy IlenloaView Answer on Stackoverflow
Solution 4 - AndroidGuihgoView Answer on Stackoverflow
Solution 5 - AndroidKirill SmirnovView Answer on Stackoverflow