我想用按钮动态更改我的应用程序的主题,所以我实现了这个:
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);
}
});
问题是代码只是更改了相关活动的主题,并且没有在所有应用中创建更改主题。
答案 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以获取帮助。