Цвет текста всплывающего меню Android (AppCompat)
Мне нужно изменить цвет текста в меню popuo, но я не могу найти способ сделать это, я могу изменить фон popmenu, но не текст, я редактирую style.xml следующим образом:
<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
<!-- API 14 theme customizations can go here. -->
<item name="popupMenuStyle">@style/MyPopupMenu</item>
<item name="android:textAppearanceLargePopupMenu">@style/myPopupMenuTextAppearanceLarge</item>
<item name="android:textAppearanceSmallPopupMenu">@style/myPopupMenuTextAppearanceSmall</item>
</style>
<style name="MyPopupMenu" parent="@style/Widget.AppCompat.PopupMenu">
<item name="android:popupBackground">#0F213F</item>
</style>
<style name="myPopupMenuTextAppearanceSmall" parent="@style/TextAppearance.AppCompat.Base.Widget.PopupMenu.Small">
<item name="android:textColor">#ffffff</item>
</style>
<style name="myPopupMenuTextAppearanceLarge" parent="@style/TextAppearance.AppCompat.Base.Widget.PopupMenu.Large">
<item name="android:textColor">#ffffff</item>
</style>
где ошибка?
Ответы
Ответ 1
<item name="textAppearanceLargePopupMenu">@style/TextAppearance.AppCompat.Light.Widget.PopupMenu.Large</item>
<item name="textAppearanceSmallPopupMenu">@style/TextAppearance.AppCompat.Light.Widget.PopupMenu.Small</item>
Я думаю, что вы используете TextAppearance.AppCompat.Base.Widget.PopupMenu. Вот ошибка, вы используете другого родителя, который не отвечает на текущий стиль.
Вы должны использовать:
TextAppearance.AppCompat.Light.Widget.PopupMenu.
Ответ 2
В styles.xml
<style name="itemTextStyle.AppTheme" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
<item name="android:textColor">@drawable/color_item_popup</item>
<item name="android:textSize">@dimen/text_content</item>
</style>
и добавить в AppTheme
<item name="android:itemTextAppearance">@style/itemTextStyle.AppTheme</item>
color_item_popup.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="@color/primary_text"/>
<item android:state_focused="true" android:color="@color/primary_text"/>
<item android:color="@color/secondary_text"/>
</selector>
Ответ 3
В styles.xml:
<style name="PopupMenu" parent="Widget.AppCompat.PopupMenu.Overflow">
<item name="android:popupBackground">@color/white</item>
</style>
В java:
Context wrapper = new ContextThemeWrapper(getContext(), R.style.PopupMenu);
final PopupMenu popupMenu = new PopupMenu(wrapper, view);
Ответ 4
Вы можете, очевидно, настроить 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);
}
Надеюсь, что это поможет.