Подтвердить что ты не робот

Как стиль PopupMenu?

Можно ли изменить стиль всплывающего меню из черного текста по умолчанию на белом фоне на темный фон без применения стиля для всей активности (что нарушает мой пользовательский интерфейс)?

4b9b3361

Ответ 1

Вы не можете установить стиль 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>

Ответ 2

Добавив к предложенному 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>

Вы заметили бы AppCompat в моих определениях стиля xml, потому что я использую библиотеку поддержки Android для того, чтобы настроить уровень API для Android ниже.

Ответ 3

Вы можете, очевидно, настроить PopupMenu по-своему. Это довольно просто. Но сначала вам нужно позаботиться о одной очень важной вещи.

PopupMenu создается следующим образом:

PopupMenu popupMenu = new PopupMenu(context, anchorView);

Теперь "контекст" здесь играет очень важную роль в стилизации. Стиль 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>

И настройте текст, как хотите,

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

Расширенный стиль

Элементы 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);
}

Надеюсь, это поможет всем вам. Спасибо.

Ответ 4

используйте тот же контекст ActionBar для создания PopupMenu

actionBar.getThemedContext()

Итак,

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