[英]Splash Screen Recreating After Calling AppCompatDelegate.setDefaultNightMode
[英]Android AppCompatDelegate.setDefaultNightMode not recreating parent activity in android 9
您好,我正在使用此 AppCompatDelegate 在白天/夜晚主题之间进行更改我有 2 个活动 A& B 此代码从活动 B 调用它应该使用所选样式重新创建活动 B & A 这里是我的代码
applyNight.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!isNight) { SharedPrefrencesMethods.savePreferences(this, getString(R.string.night_key), true); AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); } else { SharedPrefrencesMethods.savePreferences(this, getString(R.string.night_key), false); AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); } } });
我在 android 7 和 6 上对其进行了测试,它工作正常,即在活动 B 中更改模式并按回活动 A 重新创建新主题时。 在 android 9 上尝试时,它仅更改活动 B 而不会影响其父活动 A。
我也遇到了这个问题,然后在 Google 的官方 Android 开发者博客https://medium.com/androiddevelopers/appcompat-v23-2-daynight-d10f90c83e94 中听取了 Chris Banes 的建议,在应用程序的应用程序类中设置setDefaultNightMode
首先,所以我创建了一个类 EcwgApplication 扩展应用程序,如他所示,并在清单的application
部分添加了android:name=".EcwgApplication"
。 我还将我的切换主题的方法也放在应用程序类中,当用户更改主题设置时,我的设置活动可以调用(除了在调用它之前更新 SharedPreferences 与更改之前),所以它看起来像这样:
public class EcwgApplication extends Application {
public void onCreate() {
super.onCreate();
int selectedDarkLightTheme = PreferenceManager.getDefaultSharedPreferences(this).getInt(getString(R.string.preferences_dark_light_mode_selected_key), AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
AppCompatDelegate.setDefaultNightMode(selectedDarkLightTheme);
}
public static void setDarkLightTheme(int selectedDarkLightTheme) {
AppCompatDelegate.setDefaultNightMode(selectedDarkLightTheme);
}
}
这适用于 Android OS 版本 24 到 29,但是对于 21(此应用程序支持的最低版本)到 23,我会在返回第一个活动时出现黑屏,旋转屏幕可以解决这个问题,它也使清除未保存 UI 状态。 因此,我将设置屏幕的 StartActivity 更改为 StartActivityForResult,并在 onActivityResult 中检查版本号是否 <= 23,如果是,请执行this.recreate()
。
我需要继续做更多的测试,但至少到目前为止一切似乎都运行良好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.