我正在尝试在Android中实现主题更改,因为由于某些异步操作,我需要动态更改整个应用程序的外观。
我有几个这样的主题:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
</style>
<style name="YellowTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorYellowLight</item>
<item name="colorPrimaryDark">@color/colorYellowDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
</style>
<style name="GreenTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorGreenLight</item>
<item name="colorPrimaryDark">@color/colorGreenDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
</style>
我正在使用MutableLiveData
存储一些对象,这些对象用作主题更改的基础:
val dayTypeDTO = MutableLiveData<DayTypeDTO>()
然后我观察该对象,当它的值更改时,我需要更改应用程序主题:
cache.dayTypeDTO.observe(this, Observer { dto ->
if (dto != null) setTheme(dto.theme)
})
问题在于,主题更改应在视图膨胀后发生。否则,将不适用。但是由于创建视图后要注册观察者,并且由于无法预测动态变化,因此我无法真正做到这一点。
我知道我可以叫activity.recreate()
,但这只会导致无限循环。
有人可以建议如何实现此主题更改,以便通过这种可观察到的操作来更新使用colorPrimary
的所有组件?最好先手动更改它们。
答案 0 :(得分:0)
在您的视图中添加onGlobalLayoutListener,以确保在对主题设置主题之前将其放大:
https://developer.android.com/reference/android/view/ViewTreeObserver.OnGlobalLayoutListener