更改应用主题而不重新创建活动

时间:2016-11-10 11:30:45

标签: android android-appcompat app-themes

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

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

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

我怎样才能实现这个目标?

1 个答案:

答案 0 :(得分:2)

  

另一方面,Twitter和Pocket可以更改主题,而无需重新创建用户所在的活动。

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

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

更改主题是一项艰巨的任务。您必须遍历整个视图层次结构并更改所有背景颜色,文本颜色,波纹(祝您好运),并且您必须确保以后对{ {1}}将返回正确的资源。

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

之后,您可以使用一些不会更改窗口大小和位置的动画来调用Activity.recreate()。有更多的方法可以对窗口过渡进行动画处理。