重建 PreferenceFragment 时 Preference 的值错误
Preference has wrong value when rebuilding PreferenceFragment
我正在我的首选项片段的 onCreate 方法中创建几个拾色器首选项(从首选项扩展)。
颜色选择器描述了当前处于活动状态的设计。因此,当用户选择新设计(在同一个 PreferenceFragment 中)时,所有颜色选择器都必须根据新设计进行更改。
为此,我正在获取当前设计的新颜色值并重建 PreferenceFragment
public static void RebuildSettings() {
colorFieldList = GetNewColorFields();
if (mPrefsFragment != null) {
mPrefsFragment.onDestroy();
mPrefsFragment.onCreate(null);
} else Log.i(Patterns.TAG, "mPrefsFragment = null");
}
然后在我的 Preference Fragment 的 onCreate 方法中,我从 colorFieldList(使用新设计的颜色)重新创建颜色字段,如下所示:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
[...]
PreferenceCategory colorSettings = (PreferenceCategory) findPreference("prefCat_ColorSettings");
for (int i = 0; i < colorFieldList.size(); i++) {
AmbilWarnaPreference colorPicker = new AmbilWarnaPreference(getActivity(), null);
colorPicker.forceSetValue(colorFieldList.get(i).color);
colorPicker.setTitle(colorFieldList.get(i).name);
colorPicker.setSummary("Set color in " + colorFieldList.get(i).name);
colorPicker.setKey("colorField" + colorFieldList.get(i).index);
colorPicker.setOnPreferenceChangeListener(colorListener);
if (colorSettings != null)
colorSettings.addPreference(colorPicker);
}
[...]
}
现在我可以更改设计,并且颜色字段会根据新设计正常更新但只有当我还没有更改任何颜色选择器字段时。
这些字段会像它们应该的那样改变,但是 一旦我更改颜色字段/选择一种新颜色,这个字段将永远保持我选择的颜色,尽管我每次都完全重建设置设计改了!
我错过了什么?为什么只要没有值保存到 SharedPreferences (?) 颜色就会更新,但之后不会?
我想 android 总是在设置颜色选择器后从共享首选项中获取颜色选择器的值,但是我如何在 OnCreate 中覆盖它以描绘所选设计中的颜色?
非常感谢您的帮助!谢谢!
我想通了:就像我假设问题是项目总是收到其特定键的默认值。
为了覆盖此行为,我不得不在编辑器上调用 Apply()(我想提交也可以)我偏好片段的 onCreate() 方法,如下所示:
getPreferenceManager().getSharedPreferences().edit().putInt("colorField" + colorFieldList.get(i).index, colorFieldList.get(i).color).apply();
(我在上面发布的循环中执行了此操作,因此在创建时每个颜色首选项都被分配给一种新颜色,并具有覆盖的首选项值)
我正在我的首选项片段的 onCreate 方法中创建几个拾色器首选项(从首选项扩展)。
颜色选择器描述了当前处于活动状态的设计。因此,当用户选择新设计(在同一个 PreferenceFragment 中)时,所有颜色选择器都必须根据新设计进行更改。
为此,我正在获取当前设计的新颜色值并重建 PreferenceFragment
public static void RebuildSettings() {
colorFieldList = GetNewColorFields();
if (mPrefsFragment != null) {
mPrefsFragment.onDestroy();
mPrefsFragment.onCreate(null);
} else Log.i(Patterns.TAG, "mPrefsFragment = null");
}
然后在我的 Preference Fragment 的 onCreate 方法中,我从 colorFieldList(使用新设计的颜色)重新创建颜色字段,如下所示:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
[...]
PreferenceCategory colorSettings = (PreferenceCategory) findPreference("prefCat_ColorSettings");
for (int i = 0; i < colorFieldList.size(); i++) {
AmbilWarnaPreference colorPicker = new AmbilWarnaPreference(getActivity(), null);
colorPicker.forceSetValue(colorFieldList.get(i).color);
colorPicker.setTitle(colorFieldList.get(i).name);
colorPicker.setSummary("Set color in " + colorFieldList.get(i).name);
colorPicker.setKey("colorField" + colorFieldList.get(i).index);
colorPicker.setOnPreferenceChangeListener(colorListener);
if (colorSettings != null)
colorSettings.addPreference(colorPicker);
}
[...]
}
现在我可以更改设计,并且颜色字段会根据新设计正常更新但只有当我还没有更改任何颜色选择器字段时。 这些字段会像它们应该的那样改变,但是 一旦我更改颜色字段/选择一种新颜色,这个字段将永远保持我选择的颜色,尽管我每次都完全重建设置设计改了!
我错过了什么?为什么只要没有值保存到 SharedPreferences (?) 颜色就会更新,但之后不会?
我想 android 总是在设置颜色选择器后从共享首选项中获取颜色选择器的值,但是我如何在 OnCreate 中覆盖它以描绘所选设计中的颜色?
非常感谢您的帮助!谢谢!
我想通了:就像我假设问题是项目总是收到其特定键的默认值。
为了覆盖此行为,我不得不在编辑器上调用 Apply()(我想提交也可以)我偏好片段的 onCreate() 方法,如下所示:
getPreferenceManager().getSharedPreferences().edit().putInt("colorField" + colorFieldList.get(i).index, colorFieldList.get(i).color).apply();
(我在上面发布的循环中执行了此操作,因此在创建时每个颜色首选项都被分配给一种新颜色,并具有覆盖的首选项值)