【问题标题】:Changing app theme without recreating activity在不重新创建活动的情况下更改应用主题
【发布时间】:2016-11-10 11:30:45
【问题描述】:

我有一个以Theme.AppCompat.DayNight.NoActionBar 为父的自定义主题,具有白天和夜间模式的资源。

在文档中,提供了一种更改主题的方法,除非重新创建当前活动,否则主题只会在下次启动该活动时更改。

另一方面,Twitter 和 Pocket 更改主题而不重新创建用户正在进行的活动。

我怎样才能做到这一点?

【问题讨论】:

  • 这是不可能的。

标签: android android-appcompat app-themes


【解决方案1】:

另一方面,Twitter 和 Pocket 更改主题而不重新创建用户正在进行的活动。

你怎么知道?如果您正确处理保存的状态并提供看起来不像更改窗口的动画,您可以使活动娱乐看起来足够好。事实上,你可以让它看起来很好,以至于你甚至不会认出活动是重新创建的。

运行 adb shell dumpsys activity 在 Twitter 中切换夜间模式之前和之后给出以下输出:

ResumedActivity: ActivityRecord{40c4156 u0 com.twitter.android/com.twitter.app.main.MainActivity t11398}
ResumedActivity: ActivityRecord{adca640 u0 com.twitter.android/com.twitter.app.main.MainActivity t11399}

请注意活动哈希码已更改 - 活动确实重新创建。最新版本的 Twitter 和 2016 年 11 月 9 日发布的 Twitter 6.22.1 都是如此。

更改主题是一项艰巨的任务。您必须遍历整个视图层次结构并更改所有背景颜色、文本颜色、涟漪(祝您好运),并且您必须确保将来对 @ 的任何调用987654323@ 将返回正确的资源。

另一方面,您可以只调用Activity.recreate() 并让系统执行它已经编程执行的操作。

之后,您可以调用 Activity.overridePendingTransition(...) 并使用一些不会更改窗口大小和位置的动画。还有更多方法可以为窗口过渡设置动画。

【讨论】:

    猜你喜欢
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    相关资源
    最近更新 更多