3

我想用按钮动态改变我的应用程序的主题,所以我实现了这个:

 sharedPreferences = getSharedPreferences("VALUES",MODE_PRIVATE);
    int theme = sharedPreferences.getInt("THEME",2);

    switch (theme){
        case 1: setTheme(R.style.AppTheme);
            break;
        case 2: setTheme(R.style.AppTheme_AppBarOverlay);
            break;
    }

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tutotial);

这是按钮的代码:

        tb1 =(Button) findViewById(R.id.button2);

    tb1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            sharedPreferences.edit().putInt("THEME",1).apply();
            Intent intent = new Intent(tutotial.this, tutotial.class);
            startActivity(intent);
        }
    });

tb2 =(Button) findViewById(R.id.button3);

    tb2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            sharedPreferences.edit().putInt("THEME",2).apply();
            Intent intent = new Intent(tutotial.this, tutotial.class);
            startActivity(intent);
            Intent intent1 = new Intent(tutotial.this, MainActivity.class);
            startActivity(intent1);

        }
    });

问题是代码只是更改了相关活动的主题,并没有在所有应用程序中更改主题。

4

3 回答 3

1

github 上有一个名为 AntennaPod 的开源播客播放器。它包含执行此操作的示例代码。

他们这样做的方式是在每个方法ContextThemeWrapper.setTheme(int)的开头调用。Activity.onCreate()

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(UserPreferences.getTheme());
    super.onCreate(savedInstanceState);
    ......
}

这可以在每个活动中完成,或者通过创建一个在每个子类上为您执行此操作的基本活动。


仔细阅读您的问题,这正是您正在做的事情。所以我会说你在正确的轨道上。


之前似乎也有人问过这个问题:

都提供相同的解决方案。

于 2015-11-07T18:09:17.587 回答
0

android:theme您可以通过包含在activity清单文件中来将主题应用于任何活动。

例如:

<activity android:theme="@android:style/Theme.Dialog">
<activity android:theme="@style/CustomTheme">

如果您想以编程方式设置主题,请setTheme()在调用setContentView()super.onCreate()方法内部的onCreate()方法之前使用。

于 2015-11-07T17:11:07.307 回答
-1

您可以通过实现各种主题并在单击按钮时相应地更改主题来做到这一点,以编程方式参考此更改主题以获得帮助。

于 2015-11-07T17:15:06.563 回答