在 Activity 关闭之前修改 PreferenceActivity 中的 Preference 值无效
Modifying a Preference value in PreferenceActivity has no effect before Activity is closed
我只是想在 PreferenceActivity 打开时更改 Preference 的值。由于首选项中没有 "setValue" 或类似项,我尝试
我的代码:
long value = System.currentTimeMillis()/1000;
PreferenceManager.getDefaultSharedPreferences(getActivity()).edit().putString("test",""+value).apply();
getPreferenceScreen().findPreference("test").setSummary(""+value);
我的XML:
<EditTextPreference
android:key="test" />
我的期望:
当点击我的首选项时,它应该显示时间值(与摘要相同)并让我编辑它。
发生了什么:
关闭 Activity 后,该值才发生变化。下次开屏时,这个值是正确的(但实际上已经换成下一个了)
第一次尝试:
假设值为 1521143527。在摘要中正确写入,但是当我单击“首选项”时,弹出窗口显示一个空值。
第二次尝试:
Summary 已更改为 1521143540。当我点击 Preference 时,我可以编辑之前的值 (1521143527)
第三次尝试:
新摘要,但首选项值未更改且仍为:1521143540
等...
知道哪里出了问题吗?
肮脏的解决方法:
setPreferenceScreen(null);
addPreferencesFromResource(R.xml.preferences);
现在会强制更新偏好设置,但是那真的很脏,我还是不明白...
如果查看 PreferenceFragment 源代码,您会发现有一个名为 bindPreferences()
的方法将首选项值绑定到 Views
。仅在2种情况下调用此方法,
When Activity created onActivityCreated(@Nullable Bundle savedInstanceState)
- When
addPreferencesFromResource()
called. there is a handler which triggers the bindPreferences()
除此之外,无法更新视图。 bindPreferences()
是一个私有方法,所以你不能在 class 之外调用这个方法。所以你应该在这些事件之前更新你的偏好。
您提到,作为变通解决方案,您应该先更新您的首选项,然后调用 addPreferencesFromResource()
。喜欢下面
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
long value = System.currentTimeMillis()/1000;
getPreferenceManager().getSharedPreferences().edit().putString("test",""+value).commit();
addPreferencesFromResource(R.xml.pref_general);
getPreferenceScreen().findPreference("test").setSummary(""+value);
}
我只是想在 PreferenceActivity 打开时更改 Preference 的值。由于首选项中没有 "setValue" 或类似项,我尝试
我的代码:
long value = System.currentTimeMillis()/1000;
PreferenceManager.getDefaultSharedPreferences(getActivity()).edit().putString("test",""+value).apply();
getPreferenceScreen().findPreference("test").setSummary(""+value);
我的XML:
<EditTextPreference
android:key="test" />
我的期望:
当点击我的首选项时,它应该显示时间值(与摘要相同)并让我编辑它。
发生了什么:
关闭 Activity 后,该值才发生变化。下次开屏时,这个值是正确的(但实际上已经换成下一个了)
第一次尝试: 假设值为 1521143527。在摘要中正确写入,但是当我单击“首选项”时,弹出窗口显示一个空值。
第二次尝试: Summary 已更改为 1521143540。当我点击 Preference 时,我可以编辑之前的值 (1521143527)
第三次尝试: 新摘要,但首选项值未更改且仍为:1521143540
等...
知道哪里出了问题吗?
肮脏的解决方法:
setPreferenceScreen(null);
addPreferencesFromResource(R.xml.preferences);
现在会强制更新偏好设置,但是那真的很脏,我还是不明白...
如果查看 PreferenceFragment 源代码,您会发现有一个名为 bindPreferences()
的方法将首选项值绑定到 Views
。仅在2种情况下调用此方法,
When Activity created
onActivityCreated(@Nullable Bundle savedInstanceState)
- When
addPreferencesFromResource()
called. there is a handler which triggers thebindPreferences()
除此之外,无法更新视图。 bindPreferences()
是一个私有方法,所以你不能在 class 之外调用这个方法。所以你应该在这些事件之前更新你的偏好。
您提到,作为变通解决方案,您应该先更新您的首选项,然后调用 addPreferencesFromResource()
。喜欢下面
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
long value = System.currentTimeMillis()/1000;
getPreferenceManager().getSharedPreferences().edit().putString("test",""+value).commit();
addPreferencesFromResource(R.xml.pref_general);
getPreferenceScreen().findPreference("test").setSummary(""+value);
}