我实现了一个主题为父Theme.AppCompat.DayNight
的主题并将其分配给我的活动。如果我的应用程序已停止并且我将系统主题更改为暗模式,然后启动我的应用程序,则暗主题可以正常工作。但是,如果我随后在应用程序运行时关闭系统暗模式,则在我重新启动应用程序之前它不会切换主题。
我看到其他支持深色主题的应用程序在运行时只要按下系统深色模式按钮即可立即更改。
我在这里想念什么?
答案 0 :(得分:1)
好吧,当您使用AppCompatDelegate.setDefaultNightMode()
或(setLocalNightMode
)或(我假设)设置不同的主题时,DayNight主题的工作方式便是在主题之间自动切换重新遵循系统设置,系统会发出“现在可以使用夜间模式”消息
“切换”的方式是使用主题的适当变体来重新创建“活动”。这是一名开发者explaining it:
活动娱乐 如果需要更改配置,上述两种方法都将重新创建您的活动,以便可以应用新主题。这是测试您的“活动+片段”是否正确保存其实例状态的好机会。
问题是,您要覆盖这些配置更改,而不是让系统处理。您基本上是在说:“不用担心,如果由于任何这些原因需要重新创建活动,请不要这样做-我会解决的。”但这很复杂,建议您don't do that
警告::由于系统不会自动为您应用这些更改,因此自行处理配置更改会使使用替代资源更加困难。当必须避免由于配置更改而重新启动该方法时,应将此方法视为万不得已的方法,不建议在大多数应用程序中使用。
因此,通过包含这些替代,您可以阻止系统应用更改。当您重新启动应用程序时,它可以工作,因为它可以(重新)创建活动并使用正确的样式和资源对其进行设置。
我猜想删除覆盖会导致问题,因为您一直依赖它们来阻止重新创建活动,因此您没有适当的代码来保存状态并重建所有内容。 (这就是很多人首先添加覆盖的原因,这是使他们的生活更轻松的黑客手段,但这会导致诸如此类的问题!)
如果这是您的问题,则必须rework parts of your app to save and restore state when an Activity is destroyed,但是最好还是可以处理这些内容-避免从背景中回来时使内容随机空白等。