我只是在打开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" />
我的期望:
点击我的偏好时,它应显示时间值(与摘要相同)并让我对其进行编辑。
发生了什么:
仅在关闭活动后才会更改该值。下次打开屏幕时,值是正确的(但事实上已经改为下一个)
首次尝试: 我们说值是1521143527.正确地写在摘要中,但是当我点击Preference时,弹出窗口显示一个空值。
第二次尝试: 摘要已更改为1521143540.当我单击“首选项”时,我可以编辑以前的值(1521143527)
第三次尝试: 新摘要,但偏好值未更改且仍为:1521143540
等...
知道出了什么问题吗?
DIRTY WORKAROUND:
setPreferenceScreen(null);
addPreferencesFromResource(R.xml.preferences);
现在会强制优先更新,但那真的很脏,我还是不明白......
答案 0 :(得分:1)
如果您查看PreferenceFragment源代码,可以看到有一个名为bindPreferences()
的方法将首选项值绑定到Views
。仅在2种情况下调用此方法,
- 醇>
当活动创建
时onActivityCreated(@Nullable Bundle savedInstanceState)
- 调用
的处理程序addPreferencesFromResource()
时。有一个触发bindPreferences()
除此之外,视图无法更新。 bindPreferences()
是一个私有方法,因此您无法在类之外调用此方法。因此,您应该在这些事件之前更新您的偏好。
您提到,作为一种变通解决方案,您应首先更新您的偏好,然后致电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);
}