Save key-value data - developer.android.com
安卓改变主题的方法setTheme必须放在View被渲染之前
也就是在super.onCreate
与setContentView
之间
这意味着 通过ToggleButton/Switch按钮切换主题后,还要刷新页面才能生效
所以修改主题的流程变为:
- 点击按钮修改sharedPreference的主题字段
- 如果字段发生变化,刷新页面
- 渲染view之前,先读取sharedPreference的主题字段,并存为isDarkTheme
- setTheme
- setContentView
- 设置完主题后,让View的一些文案与当前主题一致,如标题、ToggleButton的状态
public class MainActivity extends AppCompatActivity {
SharedPreferences configSP;
boolean isDarkTheme;
ToggleButton toggleTheme;
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
// step.1 修改配置
configSP.edit().putBoolean("darkTheme", true).apply();
// step.2 如果配置项有变化Reload Activity使主题修改生效
if (!isDarkTheme) {
finish();
startActivity(getIntent());
}
} else {
// step.1 修改配置
configSP.edit().putBoolean("darkTheme", false).apply();
// step.2 如果配置项有变化Reload Activity使主题修改生效
if (isDarkTheme) {
finish();
startActivity(getIntent());
}
}
}
});
super.onCreate(savedInstanceState);
configSP = getSharedPreferences("config", MODE_PRIVATE);
// SharedPreferences获取值的方法都有默认值,不需要通过.contains判断key是否存在
isDarkTheme = configSP.getBoolean("darkTheme", true);
if (isDarkTheme) {
setTheme(R.style.Theme_AppCompat);
} else {
setTheme(R.style.Theme_AppCompat_Light);
}
// setTheme is Before setContentView
setContentView(R.layout.activity_main);
// 设置完主题后,让View的一些文案与当前主题一致,如标题、ToggleButton的状态
setTitle(TAG+"当前主题:"+(isDarkTheme ? "黑暗主题" : "白色主题"));
// View初始化完后,让主题的toggleButton状态与isDarkTheme一致
toggleTheme = findViewById(R.id.button4);
toggleTheme.setChecked(isDarkTheme);
相关链接