Как стилизовать текст в меню переполнения действий на устройстве с Android>4.0 и аппаратной кнопкой?

Я хотел бы, чтобы пользовательский фон и цвет текста для моего меню переполнения. Он отлично работает с устройствами без аппаратной кнопки меню, но я не могу стилизовать устройства с помощью аппаратной кнопки меню. Смотрите скриншоты:

Снимок с Galaxy NexusСкриншот из 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>

6 ответов

Решение

Я посмотрел на проблему. И, кажется, нет никакого способа изменить 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, кажется, является проблемой, я бы предложил оставить эту часть по умолчанию.

Копался в темах 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);
}

Нажатие кнопки меню при открытом меню волшебным образом закрывает его.

Кому все равно нужно уродливое черное меню с выравниванием снизу?

Вы можете применять стили и темы в переполнении MenuItem, как показано ниже. OverFlow Menu - это 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>

Для темы 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>

Попробуйте также добавить элементы без префикса 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>

То, что вы можете сделать, если вам действительно нужно изменить цвет текста меню с правого рисунка, может быть следующим "хаком":

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

Я согласен, что это не самый чистый способ (я бы сказал, что это довольно уродливо, потому что вы должны уделять внимание в каждом упражнении, где у вас есть такое меню, и название каждого пункта меню нужно менять с помощью этой логики), но это то, что отображает ожидаемый результат. Дайте мне знать, помогло ли это вам.

Ура!

Другие вопросы по тегам