无需重新创建活动即可更改应用程序主题



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

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

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

我怎样才能做到这一点?

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

你怎么知道?如果你正确地处理保存状态,并提供一个看起来不像在改变窗口的动画,你就可以让activity recreation看起来足够好。事实上,你可以让它看起来很好,你甚至不知道这个活动是重新创建的。

在Twitter中切换夜间模式前后运行adb shell dumpsys activity会得到以下输出:

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来说都是如此。

改变主题是一项不平凡的任务。你必须遍历整个视图层次结构,改变所有的背景颜色,文本颜色,波纹(祝你好运),你必须确保任何未来调用getResources().get*将返回正确的资源。

另一方面,你可以调用Activity.recreate(),让系统做它已经编程的事情。

之后,你可以调用Activity.overridePendingTransition(...)与一些动画,不改变窗口的大小和位置。

相关内容

  • 没有找到相关文章

最新更新