2017-07-27 85 views
0

在具有可配置主题的应用程序中,如何设置app:popupTheme以匹配整体主题?如何根据应用程序的整体主题更改`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的父母应该动态变化吗?还有别的吗?

回答

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. 在每个主题中,添加项目设置自定义ATTR到相应的弹出框的形式:

    <!-- 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引用的样式。

相关问题