Как стилизовать текст в меню переполнения действий на устройстве с Android> 4.0 и аппаратной кнопкой?
Я хотел бы настроить цвет фона и текста для моего меню переполнения. Он отлично работает с устройствами без кнопки меню аппаратного обеспечения, но я не могу стилизовать устройства с помощью кнопки меню аппаратного обеспечения. Смотрите скриншоты:
![Screnshot from Galaxy Nexus]()
![Screenshot from Galaxy S3]()
Я использую эти стили:
<style name="Theme.settleup" parent="@style/Theme.Sherlock.Light.DarkActionBar">
<item name="android:popupMenuStyle">@style/settleup_PopupMenu</item>
<item name="android:actionMenuTextColor">@android:color/white</item>
</style>
<style name="settleup_PopupMenu" parent="@style/Widget.Sherlock.ListPopupWindow">
<item name="android:popupBackground">@drawable/menu_dropdown_panel_settleup</item>
</style>
Ответы
Ответ 1
Я рассмотрел проблему. И, похоже, нет способа изменить textColor
для меню опций для Android >= 4.0 устройств с клавишей меню HW. Даже изменение первичных, вторичных или третичных цветов не повлияло на цвет текста.
Единственное "решение", которое приходит мне на ум, - это довольно неприятное использование API отражения Java.
Однако вы можете установить фон нижнего меню опций Android >= 4.0 HW ключевых устройств отдельно от фона раскрывающегося меню не-HW.
У вас уже есть стиль для раскрывающегося меню для не-HW. Выпадающее меню не-HW-ключа определяется android:popupMenuStyle
(и popupMenuStyle
):
<style name="Theme.settleup" parent="@style/Theme.Sherlock.Light.DarkActionBar">
<item name="android:popupMenuStyle">@style/settleup_PopupMenu</item>
</style>
Но фон меню настроек нижней панели Android >= 4.0 HW определяется с помощью пункта android:panelBackground
в теме:
<style name="Theme.settleup" parent="@style/Theme.Sherlock.Light.DarkActionBar">
<item name="android:panelBackground">@drawable/mybackground</item>
</style>
Так как кажется, что проблема заключается в изменении цвета текста для нижнего меню опций на устройствах Android >= 4.0 HW, я бы предложил оставить эту часть по умолчанию по умолчанию.
Ответ 2
Подсказка в приложении AppCompat, но все, что я пробовал, textColor остается белым. Теперь я просто всплываю меню панели инструментов вручную:
@Override
public boolean onKeyUp(int keycode, KeyEvent e) {
switch (keycode) {
case KeyEvent.KEYCODE_MENU:
if ( getSupportActionBar() != null ) {
getSupportActionBar().openOptionsMenu();
return true;
}
}
return super.onKeyUp(keycode, e);
}
Нажатие кнопки меню при открытии меню магически закрывает его.
Кому все равно нужно выровненное черное нижнее меню?
Ответ 3
Вы можете применять стили и темы в меню переполнения MenuItem, как показано ниже. Меню OverFlow - это ListView, поэтому мы можем применять тему в соответствии с списком.
Применить ниже код в styles.xml
<style name="AppTheme" parent="@android:style/Theme.Holo.Light">
<item name="android:dropDownListViewStyle">@style/PopupMenuListView</item>
<item name="android:actionBarWidgetTheme">@style/PopupMenuTextView</item>
<item name="android:popupMenuStyle">@style/PopupMenu</item>
<item name="android:listPreferredItemHeightSmall">40dp</item>
</style>
<!-- Change Overflow Menu ListView Divider Property -->
<style name="PopupMenuListView" parent="@android:style/Widget.Holo.ListView.DropDown">
<item name="android:divider">@color/app_navigation_divider</item>
<item name="android:dividerHeight">1sp</item>
<item name="android:listSelector">@drawable/list_selector</item>
</style>
<!-- Change Overflow Menu ListView Text Size and Text Size -->
<style name="PopupMenuTextView" parent="@android:style/Widget.Holo.Light.TextView">
<item name="android:textColor">@color/app_white</item>
<item name="android:textStyle">normal</item>
<item name="android:textSize">18sp</item>
<item name="android:drawablePadding">25dp</item>
<item name="android:drawableRight">@drawable/navigation_arrow_selector</item>
</style>
<!-- Change Overflow Menu Background -->
<style name="PopupMenu" parent="android:Widget.Holo.Light.ListPopupWindow">
<item name="android:popupBackground">@drawable/menu_overflow_bg</item>
</style>
Ответ 4
Для темы AppCompat:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="actionBarPopupTheme">@style/HardwareOptionMenu</item>
</style>
<style name="HardwareOptionMenu" parent="ThemeOverlay.AppCompat.Dark">
<item name="android:textColorSecondary">@color/white</item>
<item name="android:colorBackground">@color/black</item>
</style>
Ответ 5
попробуйте также добавить элементы без префикса android
<style name="Theme.settleup" parent="@style/Theme.Sherlock.Light.DarkActionBar">
<item name="android:popupMenuStyle">@style/settleup_PopupMenu</item>
<item name="popupMenuStyle">@style/settleup_PopupMenu</item>
<item name="android:actionMenuTextColor">@android:color/white</item>
<item name="actionMenuTextColor">@android:color/white</item>
</style>
<style name="settleup_PopupMenu" parent="@style/Widget.Sherlock.ListPopupWindow">
<item name="android:popupBackground">@drawable/menu_dropdown_panel_settleup</item>
<item name="popupBackground">@drawable/menu_dropdown_panel_settleup</item>
</style>
Ответ 6
что вы можете сделать, если вам действительно нужно изменить цвет текста меню с помощью правильного изображения, может быть следующий "взломать":
SpannableStringBuilder text = new SpannableStringBuilder();
text.append("MenuItem1");
text.setSpan(new ForegroundColorSpan(Color.WHITE), 0, text.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
menu.add(Menu.NONE, MENU_ITEM_1, Menu.NONE, null).setTitle(text);
Я согласен, что это не самый чистый способ (я бы сказал, это довольно уродливо, потому что вы должны уделять внимание в каждом мероприятии, где у вас есть такое меню, и название каждого пункта меню нужно изменить с помощью этой логики), но это что-то который отображает ожидаемый результат.
Сообщите мне, помогло ли вам это.
Ура!