Пользовательский стиль меню переполнения CAB

В моем приложении я показываю контекстную панель действий и потому, что у меня нет места для всех действий, некоторые из них доступны под кнопкой меню переполнения. Теперь я хочу создать меню переполнения и изменить его фон. Моя тема наследуется от Theme.AppCompat, и у меня эти стили определены:

<item name="android:popupMenuStyle">@style/PopupMenu</item> <item name="android:listPopupWindowStyle">@style/PopupMenu</item> <item name="android:dropDownListViewStyle">@style/DropDownListView</item> <style name="PopupMenu" parent="Widget.AppCompat.PopupMenu"> <!--<item name="android:popupBackground">@color/dark_color</item>--> <item name="android:textColor">?android:textColorPrimary</item> <item name="android:dropDownSelector">?popupItemBackground</item> </style> <style name="DropDownListView" parent="Widget.AppCompat.ListView.DropDown"> <item name="android:listSelector">?popupItemBackground</item> <item name="android:divider">@null</item> <item name="android:dividerHeight">0dp</item> </style> 

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

Solutions Collecting From Web of "Пользовательский стиль меню переполнения CAB"

Чтобы изменить фон меню переполнения, вам необходимо переопределить действие actionOverflowMenuStyle :

 <!-- add to your parent style --> <item name="actionOverflowMenuStyle">@style/LStyled.PopupMenu.OverflowMenu</item> <style name="LStyled.PopupMenu.OverflowMenu" parent="@style/Widget.AppCompat.PopupMenu.Overflow"> <!-- 'overlapAnchor' changes position of the popup --> <!-- true - popup will be shown over the overflow button --> <!-- false - popup will be shown below the overflow button --> <item name="overlapAnchor">false</item> <item name="android:popupBackground">@drawable/bg_cab_popup</item> </style> 

Drawable bg_cab_popup может быть любым способом. Но использование 9-патча имеет смысл.

Если вам нужно что-то изменить, кроме фона, оставьте мне комментарий.

У меня наконец есть решение. Кажется, что вам нужно добавить это в свою тему:

 <item name="actionBarPopupTheme">@style/ThemeOverlay.My</item> 

Где:

 <style name="ThemeOverlay.My" parent="ThemeOverlay.AppCompat"> <item name="android:colorBackground">@color/my_theme_background</item> </style> 

Атрибут colorBackground может принимать любое значение цвета, которое вам нравится, и при этом у вас есть меню переполнения кнопки контекстного действия.

Я предполагаю, что вы используете последнюю (21.xx) библиотеку appcompat-v7 и рекламировали новый виджет Toolbar . Для достижения того, что вы хотите, вы не изменяете основную тему приложения (кроме режима действия выбора текста), но применяете стиль к элементу Toolbar в своем макете ( style="@style/Widget.YourApp.Toolbar" ). Определение стиля может выглядеть примерно так:

 <style name="Widget.YourApp.Toolbar" parent="Widget.AppCompat.Toolbar"> <item name="android:background">#111</item> <item name="android:elevation" tools:ignore="NewApi">8dp</item> <item name="theme">@style/ThemeOverlay.YourApp.ActionBar</item> <item name="popupTheme">@style/ThemeOverlay.YourApp</item> </style> 

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

 <style name="ThemeOverlay.YourApp" parent="ThemeOverlay.AppCompat"> <item name="android:colorBackground">#f00</item> <item name="android:textColor">#ff0</item> </style> 

Важно: обратите внимание, что вы будете использовать это как тему, а не стиль . Когда вы применяете стиль, атрибуты устанавливаются только для одного элемента макета, на который вы указали его. Когда вы применяете тему, атрибуты распространяются на все ее дочерние элементы . Поэтому при использовании тем вы никогда не переопределяете background (что вызовет чрезмерный и нежелательный внешний вид) в пользу более конкретных атрибутов, таких как windowBackground или colorBackground (которые применяются только к соответствующему элементу верхнего уровня).

Чтобы завершить этот пример, я также включу тему панели инструментов:

 <style name="ThemeOverlay.YourApp.ActionBar" parent="ThemeOverlay.AppCompat.ActionBar"> <!-- these color action bar title and subtitle --> <item name="android:textColorPrimary">#00f</item> <item name="android:textColorSecondary">#0ff</item> <!-- this colors the icons (apply manual tinting for non-appcompat icons programmatically) --> <item name="colorControlNormal">#0f0</item> <!-- bug in the library - the overflow icon on Lollipop will now respect the above --> <item name="android:colorControlNormal" tools:ignore="NewApi">?colorControlNormal</item> <!-- these color the text of action items --> <item name="actionMenuTextColor">?colorControlNormal</item> </style> 

Помните: при использовании пользовательских цветов текста используйте селектор и также определяйте отключенный цвет (вдвойне, если вы используете цвет на кнопке или в меню).

РЕДАКТИРОВАТЬ

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

 <item name="actionModePopupWindowStyle">?attr/popupWindowStyle</item> 

Значение по умолчанию указывает на @style/Widget.PopupMenu который определяется следующим образом:

 <style name="Widget.PopupWindow"> <item name="popupBackground">@drawable/editbox_dropdown_background_dark</item> <item name="popupAnimationStyle">@style/Animation.PopupWindow</item> </style> 

Создайте собственный стиль на основе Widget.PopupWindow и укажите на него из actionModePopupWindowStyle .