我有一个包含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>
答案 0 :(得分:0)
我认为你的方法是正确的。听取偏好更改,然后recreate您的活动。
编辑更多上下文:
您应该将此保存为首选项中的浅色/深色变体,然后在创建活动时,根据之前>> <{strong>>调用setTheme
来调用setContentView
。