如何根据应用程序的整体主题更改“app:popupTheme”?

Lau*_*ves 2 android android-theme android-styles

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

\n\n

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

\n\n

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

\n\n
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/>\n
Run Code Online (Sandbox Code Playgroud)\n\n

中使用的这种样式app/src/main/res/layout/app_bar_main.xml,也是由Android Studio生成的:

\n\n
<android.support.v7.widget.Toolbar\n    android:id="@+id/toolbar"\n    android:layout_width="match_parent"\n    android:layout_height="?attr/actionBarSize"\n    android:background="?attr/colorPrimary"\n    app:popupTheme="@style/AppTheme.PopupOverlay"/>\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Dark"/>\n
Run Code Online (Sandbox Code Playgroud)\n\n

使其在深色主题中工作,但当浅色主题处于活动状态时,菜单看起来错误。

\n\n

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

\n

Lau*_*ves 6

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

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

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
     <attr name="popupOverlayStyle" format="reference"/>
    </resources>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在 中app/src/main/res/values/styles.xml,创建一个相当于 的深色AppTheme.PopupOverlay

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

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

    app:popupTheme="?popupOverlayStyle"
    
    Run Code Online (Sandbox Code Playgroud)

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