it-swarm.com.ru

Стилизация всплывающего меню в Android 5.0

Я готовлю свое приложение для Android 5.0, использую последнюю версию библиотеки совместимости, вот как выглядит мой стиль.

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/theme_accent</item>
        <item name="colorAccent">@color/theme_accent_secondary</item>
    </style>

    <style name="AppThemeDark" parent="Theme.AppCompat">
        <item name="colorPrimary">@color/theme_accent</item>
        <item name="colorAccent">@color/theme_accent_secondary</item>
    </style>
</resources>

(Цвет ActionBar устанавливается программно.)

Теперь я хочу, чтобы у переполненного/всплывающего меню был темный фон, как в голографической реализации, но я не могу заставить его работать, вот как это выглядит: enter image description here

Я попытался установить popupMenuStyle, но это не сработало.

Как сделать темное всплывающее меню?

13
animaonline

Решил мою проблему с помощью этого стиля:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/theme_accent</item>
    <item name="colorAccent">@color/theme_accent_secondary</item>
    <item name="actionBarStyle">@style/AbStyle</item>
    <item name="actionModeBackground">@color/actionmode_bg</item>
</style>

<style name="AbStyle" parent="Widget.AppCompat.Toolbar">
    <item name="elevation">2dp</item>
    <item name="displayOptions">homeAsUp|showTitle</item>
    <!--showHome-->
</style>

<style name="AppThemeDark" parent="Theme.AppCompat">
    <item name="colorAccent">@color/theme_accent_secondary</item>
    <item name="actionBarStyle">@style/AbStyle</item>
</style>

Мне пришлось использовать Widget.AppCompat.Toolbar в качестве родительского actionBarStyle

7
animaonline

Прекратить использование ActionBar. Если вы хотите, чтобы ToolBar был настроен как ActionBar, следуйте этому руководству в блоге разработчиков Android.

На самом деле он упоминает ваш вариант использования в Dark Action Bar и предоставляет следующий код:

<Android.support.v7.widget.Toolbar
    Android:layout_height=”wrap_content”
    Android:layout_width=”match_parent”
    Android:minHeight=”@dimen/triple_height_toolbar”
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
20
Derk-Jan

Не полный ответ, но то, что я нашел до сих пор:

В прошлых версиях вам нужно было указать drawable (Check https://github.com/StylingAndroid/StylingActionBar code и tutorials)

Видимо, теперь это цвет. Чтобы изменить его, вам нужно указать следующую тему:

<resources xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <style name="AppTheme" parent="Android:Theme.Material.Light.DarkActionBar">
        <item name="Android:actionBarPopupTheme">@style/popupNew</item>
    </style>

    <style name="popupNew" parent="Android:ThemeOverlay.Material.Light">
        <item name="Android:colorBackground">@color/red</item>
    </style>

</resources>

Это работает правильно, если тема, примененная к приложению, просто . Если я добавлю Android:actionBarPopupTheme к моей существующей теме, она не будет работать. Я пытаюсь понять, почему.

10
Macarse

Добавьте свойство popupTheme на свою панель инструментов:

<Android.support.v7.widget.Toolbar
  xmlns:Android="http://schemas.Android.com/apk/res/Android"
  xmlns:app="http://schemas.Android.com/apk/res-auto"
  Android:id="@+id/toolbar"
  Android:layout_width="match_parent"
  Android:layout_height="wrap_content"
  Android:background="@color/color_primary"
  app:theme="@style/Theme.AppCompat.Light"
  app:popupTheme="@style/Theme.AppCompat" />

Или определите новый стиль для вашей панели инструментов:

<style name="MyToolBarStyle" parent="Widget.AppCompat.Toolbar">
    <item name="Android:background">@color/green</item>
    <item name="popupTheme">@style/Theme.AppCompat.Light</item>
    <item name="theme">@style/Theme.AppCompat</item>
</style>
6
Lukas

На этот вопрос уже был дан ответ на стилизацию с помощью XML, но я добавляю здесь объяснение того, как самостоятельно найти решение для этого и подобных вопросов о стилизации. 

Во-первых, это решение при использовании AppCompat. В style.xml вашего приложения добавьте actionBarPopupTheme к своей теме:

<style name="Theme.MyTheme" parent="@style/Base.Theme.AppCompat.Light.DarkActionBar">
    ...other stuff here

    <item name="actionBarPopupTheme">@style/Theme.MyTheme.ActionBarPopupTheme</item>
</style>

<style name="Theme.MyTheme.ActionBarPopupTheme" parent="@style/ThemeOverlay.AppCompat.Light">
    <item name="Android:textColor">@Android:color/white</item>
    <item name="Android:background">@Android:color/black</item>
</style>

Вот шаги, которые я предпринял, чтобы прийти к этому решению (требуется небольшая детективная работа, так как документация по Android оставляет желать лучшего):

  • Откройте style.xml вашего приложения в Android Studio
  • В строке, где определена тема вашего приложения, поместите экранный курсор в родительскую тему (например, щелкните в @ style/Base.Theme.AppCompat.Light.DarkActionBar), а затем нажмите клавишу F4. Это должно привести вас к исходному коду для стиля в библиотеке appcompat.
  • В этом стиле я увидел эту строку:

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

    Это выглядело как возможное место для изменения темы всплывающего окна. Я искал "actionBarPopupTheme" в бедных Документация для разработчиков под Android и найдена «Ссылка на тему, которая должна использоваться для Раздувания всплывающих окон, отображаемых виджетами на панели действий». Так что с этим стоило поиграть.

  • Я скопировал строку appcompat, содержащую "actionBarPopupTheme", в мой style.xml, а затем в этой строке заменил ссылку на тему элемента (бит, выделенный жирным шрифтом выше) на Theme.MyTheme.ActionBarPopupTheme.

  • В моем style.xml я создал свой новый стиль под названием Theme.MyTheme.ActionBarPopupTheme. Я использовал тот же родитель, который использовался в стиле, который я скопировал из источника appcompat (бит, выделенный жирным шрифтом выше).
  • Чтобы убедиться, что мой новый стиль всплывающих окон работает, я изменил родительский стиль на ThemeOverlay.AppCompat.Dark, затем запустил и протестировал код на устройстве. Стиль всплывающих окон изменился, и теперь я знал, что переопределение actionBarPopupTheme было правильным решением. Затем я вернулся на ThemeOverlay.AppCompat.Light. 
  • Следующая задача - определить, какие имена элементов следует переопределить в Theme.MyTheme.ActionBarPopupTheme. Я изменил цвет текста и фона. Найти правильные названия предметов, которые меняют стиль чего-либо, может быть сложно в некоторых случаях. Один из способов найти менее очевидные имена элементов стиля - это просмотреть определения стилей в xml-файле appcompat (тот, который вы открыли, нажимая F4 на 2-м шаге выше), постоянно опускаясь в родительские стили (снова F4!), Пока не найдете что-то это может делать то, что вы хотите. Поиск Google также поможет здесь. 
1
pbm