如何根据应用程序的整体主题更改 `app:popupTheme`?
How to change `app:popupTheme` based on app's overall theme?
在可配置主题的应用中,如何设置app:popupTheme
来匹配整体主题?
我使用 Android Studio 的向导创建了一个带导航抽屉的应用程序。然后我修改了这段代码,添加了一个复选框,用于在运行时在深色主题和浅色主题之间进行选择,并在 activity 上调用 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
的 parent:
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Dark"/>
让它在深色主题下工作,但当浅色主题处于活动状态时菜单看起来不对。
让菜单的颜色动态适应应用程序的整体主题(深色还是浅色)的正确方法是什么? app:popupTheme
应该动态变化吗? AppTheme.PopupOverlay
的 parent 应该动态变化吗?还有别的吗?
这可以通过使用自定义 attr
:
使用自定义 attr
创建 app/src/main/res/values/attrs.xml
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="popupOverlayStyle" format="reference"/>
</resources>
在 app/src/main/res/values/styles.xml
中,创建相当于 AppTheme.PopupOverlay
:
的深色
<style name="AppTheme.PopupOverlay.Dark"
parent="ThemeOverlay.AppCompat.Dark"/>
在每个主题中,添加一个项目,将自定义属性设置为适当的弹出样式:
<!-- in the light AppTheme -->
<item name="popupOverlayStyle">@style/AppTheme.PopupOverlay</item>
<!-- in the dark AppTheme -->
<item name="popupOverlayStyle">@style/AppTheme.PopupOverlay.Dark</item>
在 app/src/main/res/layout/app_bar_main.xml
中设置 app:popupTheme
以引用自定义 attr
:
app:popupTheme="?popupOverlayStyle"
更改应用的主题将自动调整 app:popupTheme
引用的样式。
在可配置主题的应用中,如何设置app:popupTheme
来匹配整体主题?
我使用 Android Studio 的向导创建了一个带导航抽屉的应用程序。然后我修改了这段代码,添加了一个复选框,用于在运行时在深色主题和浅色主题之间进行选择,并在 activity 上调用 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
的 parent:
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Dark"/>
让它在深色主题下工作,但当浅色主题处于活动状态时菜单看起来不对。
让菜单的颜色动态适应应用程序的整体主题(深色还是浅色)的正确方法是什么? app:popupTheme
应该动态变化吗? AppTheme.PopupOverlay
的 parent 应该动态变化吗?还有别的吗?
这可以通过使用自定义 attr
:
使用自定义
attr
创建app/src/main/res/values/attrs.xml
:<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="popupOverlayStyle" format="reference"/> </resources>
在
的深色app/src/main/res/values/styles.xml
中,创建相当于AppTheme.PopupOverlay
:<style name="AppTheme.PopupOverlay.Dark" parent="ThemeOverlay.AppCompat.Dark"/>
在每个主题中,添加一个项目,将自定义属性设置为适当的弹出样式:
<!-- in the light AppTheme --> <item name="popupOverlayStyle">@style/AppTheme.PopupOverlay</item> <!-- in the dark AppTheme --> <item name="popupOverlayStyle">@style/AppTheme.PopupOverlay.Dark</item>
在
app/src/main/res/layout/app_bar_main.xml
中设置app:popupTheme
以引用自定义attr
:app:popupTheme="?popupOverlayStyle"
更改应用的主题将自动调整 app:popupTheme
引用的样式。