Android 在不重新启动活动的情况下更改主题
我无法在不重新启动活动的情况下更改应用程序主题。 项目结构类似于1个主要Android 在不重新启动活动的情况下更改主题,android,android-fragments,android-styles,theme-daynight,Android,Android Fragments,Android Styles,Theme Daynight,我无法在不重新启动活动的情况下更改应用程序主题。 项目结构类似于1个主要活动和5个片段s,其中包含底部导航视图;主题更改切换在设置Fragment中,其他片段包含具有不同视图类型的数据列表 styles.xml <style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar"> <item name="colorPrimary">@c
活动
和5个片段
s,其中包含底部导航视图
;主题更改切换在设置Fragment
中,其他片段包含具有不同视图类型的数据列表
styles.xml
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowBackground">@null</item>
<item name="android:windowDisablePreview">true</item>
<item name="android:ambientShadowAlpha">0.1</item>
<item name="android:spotShadowAlpha">0.1</item>
</style>
问题是,每次主题更改时,它都会重新启动活动并弄乱其中的片段,但主题会更改。此外,在主题更改时重新启动活动还有2秒的延迟
我见过一些应用在没有重启的情况下流畅地改变主题(看起来不像重启)
我在一些线程中看到,如果我将android:configChanges=“uiMode”
添加到AndroidManifest.xml
然后活动将不会重新启动,而是调用onConfigurationChanged
,我必须手动更改每个视图的颜色。由于我在活动中有5个片段,其中包含不同视图类型的列表,因此更改每个项目的颜色将非常繁忙。有人能提出解决这个问题的办法吗。谢谢请检查这个答案
private static MyApp singleton = null;
public synchronized static MyApp getInstance() {
if (singleton == null) {
singleton = new MyApp();
}
return singleton;
}
@Override
public void onCreate() {
super.onCreate();
singleton = this;
MultiDex.install(this);
Stetho.initializeWithDefaults(this);
checkAppModeColor(false);
}
public static void setDarkLightTheme(int theme) {
AppCompatDelegate.setDefaultNightMode(theme);
}
public void checkAppModeColor(boolean isDarkModeOnly) {
if (isDarkModeOnly) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
} else {
PrefConfig prefConfig = new PrefConfig(this);
if (prefConfig.getAppTheme().equalsIgnoreCase("Auto")) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
} else if (prefConfig.getAppTheme().equalsIgnoreCase("Dark")) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}
}
}
}