【问题标题】:How to change `app:popupTheme` based on app's overall theme?如何根据应用的整体主题更改 `app:popupTheme`?
【发布时间】:2017-07-27 17:48:36
【问题描述】:

在具有可配置主题的应用中,如何设置app:popupTheme 以匹配整体主题?

我使用 Android Studio 的向导创建了一个带有导航抽屉的应用。然后我修改了这段代码,添加了一个复选框,用于在运行时在深色主题和浅色主题之间进行选择,并在活动上调用 setTheme。完整代码可以在this github repo找到。

app/src/main/res/values/styles.xml 中,Android Studio 生成了以下内容:

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/>

这个样式用在app/src/main/res/layout/app_bar_main.xml,也是Android Studio生成的:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:popupTheme="@style/AppTheme.PopupOverlay"/>

app:popupTheme 属性决定了“⋮”菜单使用的样式。使用浅色主题时这看起来不错,但是当我在运行时将应用程序切换到深色主题时,菜单的颜色错误。我知道我可以更改AppTheme.PopupOverlay 的父级,如下所示:

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Dark"/>

让它在深色主题中工作,但是当浅色主题处于活动状态时,菜单看起来不对。

让菜单的颜色动态适应应用程序的整体主题(无论是深色还是浅色)的正确方法是什么? app:popupTheme 应该动态变化吗? AppTheme.PopupOverlay 的父级应该动态变化吗?还有什么?

【问题讨论】:

    标签: android android-theme android-styles


    【解决方案1】:

    这可以通过使用自定义attr 来完成:

    1. 使用自定义attr 创建app/src/main/res/values/attrs.xml

      <?xml version="1.0" encoding="utf-8"?>
      <resources>
       <attr name="popupOverlayStyle" format="reference"/>
      </resources>
      
    2. app/src/main/res/values/styles.xml 中,创建一个与AppTheme.PopupOverlay 等效的暗色:

      <style name="AppTheme.PopupOverlay.Dark" 
           parent="ThemeOverlay.AppCompat.Dark"/>
      
    3. 在每个主题中,添加一个项目,将自定义属性设置为适当的弹出样式:

      <!-- in the light AppTheme -->
      <item name="popupOverlayStyle">@style/AppTheme.PopupOverlay</item>
      
      <!-- in the dark AppTheme -->
      <item name="popupOverlayStyle">@style/AppTheme.PopupOverlay.Dark</item>
      
    4. app/src/main/res/layout/app_bar_main.xml 中设置app:popupTheme 以引用自定义attr

      app:popupTheme="?popupOverlayStyle"
      

    更改应用的主题将自动调整 app:popupTheme 引用的样式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-14
      • 2021-07-06
      • 1970-01-01
      • 2012-11-24
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      相关资源
      最近更新 更多