Skip to content

Latest commit

 

History

History
89 lines (71 loc) · 2.76 KB

android_change_theme.md

File metadata and controls

89 lines (71 loc) · 2.76 KB

Save key-value data - developer.android.com

安卓改变主题的方法setTheme必须放在View被渲染之前

也就是在super.onCreatesetContentView之间

这意味着 通过ToggleButton/Switch按钮切换主题后,还要刷新页面才能生效

所以修改主题的流程变为:

  1. 点击按钮修改sharedPreference的主题字段
  2. 如果字段发生变化,刷新页面
  3. 渲染view之前,先读取sharedPreference的主题字段,并存为isDarkTheme
  4. setTheme
  5. setContentView
  6. 设置完主题后,让View的一些文案与当前主题一致,如标题、ToggleButton的状态

初始化

public class MainActivity extends AppCompatActivity {

  SharedPreferences configSP;
  boolean isDarkTheme;
  ToggleButton toggleTheme;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
  // ...

Toggle按钮

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

相关链接