我只是想在PreferenceActivity打开时更改首选项的值。由于在首选项上没有“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。正确地写在摘要中,但是当我单击首选项时,弹出窗口显示一个空值。
第二次尝试:
摘要改为1521143540。当我点击Preference时,我可以编辑上一个值(1521143527)
第三次尝试:
新摘要,但首选项值未更改,仍为:1521143540
等。。。
知道怎么了吗?
肮脏的解决方法:
setPreferenceScreen(null);
addPreferencesFromResource(R.xml.preferences);
现在将强制首选项更新,但这真的很肮脏,我仍然不明白…
最佳答案
如果查看PreferenceFragment源代码,可以看到有一个名为bindPreferences()
的方法将首选项值绑定到Views
。只有在两种情况下这个方法被调用,
创建活动时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);
}