在Android应用中更改主题

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);

        }
    });

问题在于代码只是更改了与活动相关的主题,而没有使整个应用程序更改主题。
3个回答

1

在github上有一个名为AntennaPod的开源播客播放器(链接)。它包含了实现此功能的示例代码。

他们的做法是在每个Activity.onCreate()方法的开始调用ContextThemeWrapper.setTheme(int)

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

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


在仔细阅读了你的问题后,这正是你正在做的。所以我认为你正在正确的轨道上。

看起来这个问题之前已经被问过了:

所有的解决方案都是一样的。


0

您可以通过在清单文件中的activity标签内包含android:theme属性来为任何活动应用主题。

例如:

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

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


我想以编程的方式设置主题,我按照你告诉我的方法做了。问题是我实现的代码只设置了一个活动的主题,而我希望设置所有的活动的主题。在styles.xml中,我有两个主题,每个按钮对应一个主题。 - Fernando Luján Martínez
就像我说的那样,在每个<activity>标签中放置您想要的主题,或者另一种解决方案是在每个活动的setContentView()之前设置您的主题。 - Fakher

-1

您可以通过实现不同的主题,并在单击按钮时相应地更改主题来完成此操作,请参考编程式更改主题以获取帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接