立即在Activity中应用样式设置

时间:2017-04-04 20:10:31

标签: android sharedpreferences

我有一个包含PreferenceFragment的活动。用户可以在此活动中更改应用程序的样式(浅色主题或黑暗主题)。现在我希望立即看到变化。这意味着,当用户更改PreferenceFragment中的样式设置时,我希望活动的样式发生变化。

我的想法是在OnSharedPreferenceChangeListener中使用PreferenceFragment收听偏好更改并重新创建活动。

但我不认为这是正确的方法。那么,这里的最佳做法是什么?提前谢谢。

更新

的活动:

public class SettingsActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    loadSettings();

    getFragmentManager().beginTransaction()
      .replace(android.R.id.content, new SettingsFragment())
      .commit();
  }

  private void loadSettings() {
    SharedPreferences sharedPreferences =
      PreferenceManager.getDefaultSharedPreferences(this);

    boolean darkTheme =
      sharedPreferences.getBoolean(getText(R.string.pref_theme_key).toString(), false);

    if (darkTheme) {
      setTheme(R.style.DarkTheme);
    }
  }
}

PreferenceFragment:

public class SettingsFragment extends PreferenceFragment
  implements SharedPreferences.OnSharedPreferenceChangeListener {

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);
  }

  @Override
  public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    if (key.equals(getText(R.string.pref_theme_key))) {
      // recreate Activity
    }
  }
}

设定:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
  android:defaultValue="false"
  android:key="@string/pref_theme_key"
  android:title="@string/pref_theme" />
</PreferenceScreen>

1 个答案:

答案 0 :(得分:0)

我认为你的方法是正确的。听取偏好更改,然后recreate您的活动。

编辑更多上下文:

您应该将此保存为首选项中的浅色/深色变体,然后在创建活动时,根据之前> <{strong>>调用setTheme来调用setContentView