Android 如何在所有活动中动态更改主题?

我正在尝试在所有活动中动态切换背景主题。但是目前,我只能让它打开开关所在的当前活动。我尝试了以下方法:


使用setTheme于其他活动集的主题,但导致的错误:cannot find symbol method setTheme(int):


ConstraintLayout homeActivity = (ConstraintLayout) findViewById(R.id.homeLayout);

homeActivity.setTheme(R.style.darktheme);

也试过了getTheme,但是报错non-static method getTheme() cannot be referenced from a static context::


Resources.Theme theme = super.getTheme();

theme.applyStyle(R.style.darktheme,true);

请提供有关如何修复这些错误或替代方法的指导。


更新,首选项管理器遇到的新问题:这是当前实现的,当切换黑暗主题时应该跨活动显示,但应用程序完全变黑而没有错误:


myswitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override

        public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {

            if (isChecked){


                PreferenceManager

                        .getDefaultSharedPreferences(DisplaySettingActivity.this)

                        .edit()

                        .putInt("ActivityTheme", R.style.darktheme)

                        .commit();

                DisplaySettingActivity.this.recreate();

            }


开心每一天1111
浏览 151回答 2
2回答

饮歌长啸

您可以尝试创建一个改变主题的 baseActivity,然后子类化该活动并修改您的主题。让我知道它是否有效

鸿蒙传说

为了扩展 Saham 的答案,这可以通过子类化 Activity 并覆盖 onCreate() 来解决:public class ThemeChangeActivity extends Activity {    @Override    public void onCreate(Bundle savedInstanceState) {        // Gets the saved theme ID from SharedPrefs,         // or uses default_theme if no theme ID has been saved        int theme = PreferenceManager.getDefaultSharedPreferences(this).getInt("ActivityTheme", R.id.default_theme);        // Set this Activity's theme to the saved theme        setTheme(theme);        // Continue with creation        super.onCreate(savedInstanceState);    }}现在,从 ThemeChangeActivity 扩展所有要更改主题的活动。每当您想更改活动的主题时,您都可以使用:PreferenceManager    .getDefaultSharedPreferences(this)    .edit()    .putInt("ActivityTheme", R.id.theme_you_want_to_set)    .commit();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java