在Android应用中更改主题

时间:2015-11-07 17:08:00

标签: android android-sharedpreferences

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

 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 个答案:

答案 0 :(得分:1)

有一个open source podcast player called AntennaPod on github。它包含执行此操作的示例代码。

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

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

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

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

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

所有提供相同的解决方案。

答案 1 :(得分:0)

您可以在清单文件中的android:theme内加activity,将主题应用于任何活动。

例如:

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

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

答案 2 :(得分:-1)

您可以通过实施各种主题来执行此操作,然后点击按钮相应地更改主题,请参阅此change theme programatically以获取帮助。