如果仅在“夜间模式”为“开”的情况下屏幕旋转发生变化,将重新创建活动

时间:2019-04-25 09:33:18

标签: android android-appcompat android-resources android-night-mode

我有这个ActivityAppCompatActivity的子类):

<activity
    android:name=".ui.settings.SettingsActivity"
    android:configChanges="keyboardHidden|smallestScreenSize|orientation|screenSize|screenLayout"
    android:launchMode="singleTask"
    android:parentActivityName=".ui.main.MainActivity" />

现在,当我在正常(即“白天”)模式下旋转手机时,我接到了onConfigurationChanged的电话,但没有重新创建Activity

但是,当应用程序设置为夜间模式时(通过在创建AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)之前在我的Application中调用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都是在旋转之前 在夜间模式下渲染的,每次旋转后都{1}}。

那么,这是怎么回事,我该怎么做才能获得更一致的行为? (无论应用程序是否处于夜间模式,屏幕旋转后都要重新创建(或不重新创建)Activity。)

1 个答案:

答案 0 :(得分:1)

似乎是一个错误,将根据此issue在AppCompat v1.1.0中修复。

从AppCompat v1.1.0-alpha03开始,您不再需要uiMode中的configChanges标志作为解决方法