android - 在不重新创建 Activity 的情况下更改应用程序主题

标签 android android-appcompat app-themes

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

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

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

我怎样才能做到这一点?

最佳答案

Twitter and Pocket on the other hand change the themes without recreating the activity the user is on.

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

在 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}

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

更改主题是一项非常重要的任务。您必须遍历整个 View 层次结构并更改所有背景颜色、文本颜色、波纹(祝您好运),并且您必须确保以后对 getResources().get* 的任何调用将返回正确的资源。

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

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

关于android - 在不重新创建 Activity 的情况下更改应用程序主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40526569/

相关文章:

android - 错误 : invalid parent reference 'style/Widget.AppCompat.Light.ActionBar.Solid.Inverse'

asp.net - 使用应用主题时,如何最好地处理移动和桌面 CSS 检测

c# - 如何从我的 App_Themes 文件夹中列出可用的 Css 类?

android - 错误 :(42, 30) 错误 : package com. google.android.gcm 不存在

java - 安卓工作室 : UNEXPECTED TOP-LEVEL EXCEPTION:

java.lang.NoClassDefFoundError : Failed resolution of: Landroid/support/v7/appcompat/R$drawable; 错误

android - 在Android中使用Firebase时发生Appcompat错误

android - Widget.Material3 TextAppearance 属性错误

java - com.firebase.client.FirebaseException : Failed to bounce to type

android - 如何在 API 11 以下全屏打开 android 的 webview 上的嵌入式视频?