在关闭Activity之前,修改PreferenceActivity中的Preference值无效

时间:2018-03-15 19:50:28

标签: android sharedpreferences preferenceactivity

我只是在打开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);

现在会强制优先更新,但那真的很脏,我还是不明白......

1 个答案:

答案 0 :(得分:1)

如果您查看PreferenceFragment源代码,可以看到有一个名为bindPreferences()的方法将首选项值绑定到Views。仅在2种情况下调用此方法,

  
      
  1. 当活动创建onActivityCreated(@Nullable Bundle savedInstanceState)

    时      
        
    1. 调用addPreferencesFromResource()时。有一个触发bindPreferences()
    2. 的处理程序   
  2.   

除此之外,视图无法更新。 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);
        }