【发布时间】:2019-04-25 09:33:18
【问题描述】:
我有这个Activity(AppCompatActivity 的子类):
<activity
android:name=".ui.settings.SettingsActivity"
android:configChanges="keyboardHidden|smallestScreenSize|orientation|screenSize|screenLayout"
android:launchMode="singleTask"
android:parentActivityName=".ui.main.MainActivity" />
现在,当我在正常(即“白天”)模式下旋转手机时,我接到了onConfigurationChanged 的电话,但Activity 没有重新创建。
但是,当应用程序设置为夜间模式时(通过在 Application 中调用 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) 在创建 Activity 之前)并且我然后旋转手机,我首先得到一个调用onConfigurationChanged,然后Activity 被重新创建也,即使uiMode 根本没有改变!当我将 uiMode 添加到 configChanges 时,这种情况就消失了,在我的 AndroidManifest.xml 中应该被忽略,但我需要这样做似乎很奇怪。
从源代码看来:
-
onConfigurationChanged调用getDelegate().onConfigurationChanged(newConfig);转到AppCompatDelegateImpl.onConfigurationChanged(newConfig) - 那里,
applyDayNight()被调用 - 那里,
getNightMode返回AppCompatDelegateImpl.MODE_NIGHT_YES,这是有道理的,因为这是我设置的。mapNightMode只是返回该值不变。然后updateForNightMode(AppCompatDelegateImpl.MODE_NIGHT_YES)被调用 - 那里,
newNightMode被正确计算为Configuration.UI_MODE_NIGHT_YES但是currentNightMode(从mContext.getResources().getConfiguration().uiMode读入)在每次旋转后总是显示为Configuration.UI_MODE_NIGHT_NO,即使Activity在夜间模式下渲染在旋转之前。
那么,这里发生了什么,我可以做些什么来获得更一致的行为? (无论应用是否处于夜间模式,在屏幕旋转后重新创建(或不创建)Activity。)
【问题讨论】:
-
好像你需要在配置更改列表中添加
uiMode:stackoverflow.com/questions/52313812/…
标签: android android-appcompat android-resources android-night-mode