我有一个自定义主题,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(...)
与一些动画,不改变窗口的大小和位置。