启用/禁用夜间模式时,如何从另一个活动重新创建活动?

时间:2019-06-19 12:12:38

标签: android android-activity android-theme

我发现了很多与此相关的问题,但是我的问题有些不同。

在SettingActivity中,我通过以下代码启用/禁用夜间模式:

ApplicationClass.setNightMode();
ApplicationClass.setDayMode();

用应用程序类编写的精算代码。

但是当我从SettingActivity返回MainActivity时,由于onCreate()方法未调用,颜色不会更改布局。

启用/禁用夜间模式后,如何从SettingActivity重新创建MainActivity。

启用和禁用夜间模式的应用程序代码:

    public static void setNightMode(){
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
    }

    public static void setDayMode(){
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
    }

3 个答案:

答案 0 :(得分:1)

您的AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);应该在应用程序级别。而且,当您回退或前进应用之间的任何活动时,这将不是问题。不要忘记将其注册到清单。

示例:

public class TestApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        //give a start value AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
    }

    public static void setNightMode(){
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
    }

    public static void setDayModeOrSth(){
        //AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
    }
}

在清单文件中:

<application
            android:name="package.name.TestApplication"

比起您的主动性/片段

Testapplication.setDayModeOrSth();

Testapplication.setNightMode();

请原谅我的愚蠢命名和示例:)但这将是这样。祝好运。

答案 1 :(得分:0)

如果重新创建MainActivity,将会丢失其当前状态,因此您可以尝试覆盖onResume并检查是否需要启用/禁用夜间模式:

public class MainAcitivy extends ... {

    .....

    @Override
    public void onResume(){
        super.onResume();
        if(nightModeOn) {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        }
}

另一种解决方案是通过覆盖SettingActivity中的onBackPressed来启动新的MainActivity并启动MainActivity:

public class SettingsActivity extends .. {

    .....

    @Override
    public void onBackPressed() {
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finishAffinity();
    }

}

答案 2 :(得分:0)

您可以覆盖活动的onConfigurationChanged方法。

public abstract void onConfigurationChanged (Configuration newConfig)