在提交完成之前触发Android onSharedPreferenceChanged

时间:2014-09-07 21:42:20

标签: android event-handling sharedpreferences commit

我有一个非常标准的PreferenceFragment使用

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.settings);

    prefs = getPreferenceScreen().getSharedPreferences();
}

 @Override
public void onResume() {
    super.onResume();
    prefs.registerOnSharedPreferenceChangeListener(this);

    updatePreferences(getPreferenceScreen());
}

@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    Log.d(TAG, "onSharedPreferenceChanged " + key);
    updatePreference(findPreference(key));
}

@Override
public void onPause() {
    super.onPause();
    prefs.unregisterOnSharedPreferenceChangeListener(this);
}

在settings.xml中,我引用了DialogPreference,如下所示:

@Override
protected void onDialogClosed(boolean ok) {
    super.onDialogClosed(ok);

    if (ok) {
        Log.d(TAG, "onDialogClosed OK");

        SharedPreferences.Editor editor = settings.edit();
        editor.putString(SettingKeys.SOME_KEY, X);
        final boolean commit = editor.commit();
        Log.d(TAG, "onDialogClosed commit: " + commit);
    }
}

但是,我得到以下序列:

onDialogClosed OK
onSharedPreferenceChanged SOME_KEY
onDialogClosed commit: true

表示在最终提交完成之前触发onSharedPreferenceChanged事件。这意味着我的PreferenceFragment无法读取onSharedPreferenceChanged处理程序中的最新值...这让我很生气。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

除非我遗漏了某些内容,否则您的顺序实际上是正确的:

  1. " onDialogClosed OK"是第一个打印输出
  2. 然后,您将获得编辑器,设置一些密钥
  3. 您正在调用editor.commit()。 When a shared preference is changed, added, or removed,onShared onSharedPreferenceChanged()被触发,然后打印第二行:" onSharedPreferenceChanged SOME_KEY"。
  4. 剩下的行打印" onDialogClosed commit:true",提交后