0

第一次执行夜间模式代码时,它会重新启动 Activity

第二次,代码将正常工作并对程序进行更改

我使用了以下代码:

public class Splash extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        new CheckedNightMode().execute();

    }
    private class CheckedNightMode extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... voids) {
            SharedPreferences sharedpreferences = getApplicationContext().getSharedPreferences("Night_Mode", Context.MODE_PRIVATE);
            boolean state = sharedpreferences.getBoolean("State", false);
            if (state) {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            } else {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            checkLanguage();
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    startActivity(new Intent(Splash.this, Main.class));
                    finish();
                }
            }, 3000);
        }

        private void checkLanguage() {
            SharedPreferences sharedpreferences = getApplicationContext().getSharedPreferences("Language", Context.MODE_PRIVATE);
            String checkedLanguage = sharedpreferences.getString("Select", "en");
            setLanguageState(checkedLanguage);
        }

        private void setLanguageState(String language) {
            Resources resources = getResources();
            Configuration configuration = resources.getConfiguration();
            DisplayMetrics displayMetrics = resources.getDisplayMetrics();
            configuration.setLocale(Locale.forLanguageTag(language));
            resources.updateConfiguration(configuration, displayMetrics);
        }
    }
}

这是我的 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/colorRed</item>
    </style>

用我试过的主题Theme.MaterialComponents.DayNight.NoActionBar,但还是一样

4

2 回答 2

0

这是默认行为。由于资源已更改,因此 android:configChanges 默认为重新启动活动。阅读https://developer.android.com/guide/topics/resources/runtime-changes以了解。本质上,您遇到的是预期的行为,而不是错误,您可能应该重新启动活动,否则您将不得不递归地重新实例化/重新配置每个视图,这将是复杂和错误的。

于 2019-09-14T10:18:14.740 回答
0

我的代码是正确的。谷歌自己的文档指出,如果你想在运行时改变主题,当前的动作将被重新启动。

注意:从 AppCompat v1.1.0 开始,setDefaultNightMode() 会自动重新创建任何已启动的活动。

于 2019-09-14T11:36:34.033 回答