android - 当且仅当夜间模式打开时,屏幕旋转发生变化时, Activity 才会重新创建

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

我有这个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不会重新创建。

但是,当应用程序设置为夜间模式(通过在创建 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每次旋转后,即使 Activity 旋转之前以夜间模式呈现。

那么,这里发生了什么,我可以做些什么来获得更一致的行为? (在屏幕旋转后重新创建(或不创建)Activity,无论应用是否处于夜间模式。)

最佳答案

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

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

关于android - 当且仅当夜间模式打开时,屏幕旋转发生变化时, Activity 才会重新创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55846087/

相关文章:

android - 无法识别 android UIautomator 查看器中的弹出窗口

c# - Xamarin 异常中的 Microsoft Vision API

android - 在 Android Studio 0.8.9 上导入 actionbarsherlock

android - 如何正确使用 Material 主题?

android - 如何在 Android 资源中定义和使用整数值?

java - Android 设备之间的消息服务

android - 将 android 移植到自定义 arm 设备需要哪些知识/专长?

android - swipeRefreshLayout appcompat 圈

android - dot42:为原始资源(mp3 文件)调用 SoundPool.Load 方法时抛出异常

安卓 : Separate resources for 'androidTest' '