Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在不重新启动活动的情况下更改主题_Android_Android Fragments_Android Styles_Theme Daynight - Fatal编程技术网

Android 在不重新启动活动的情况下更改主题

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

我无法在不重新启动活动的情况下更改应用程序主题。 项目结构类似于1个主要
活动
和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);
        }
    }
  }
}