强制主题更改为可观察的动作

时间:2018-07-10 13:31:47

标签: android kotlin rx-java2 android-theme

我正在尝试在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的所有组件?最好先手动更改它们。

1 个答案:

答案 0 :(得分:0)

在您的视图中添加onGlobalLayoutListener,以确保在对主题设置主题之前将其放大:

https://developer.android.com/reference/android/view/ViewTreeObserver.OnGlobalLayoutListener