未使用自定义DialogPreference和bindPreferenceSummaryToValue设置默认值

时间:2016-12-23 18:08:31

标签: android sharedpreferences dialog-preference

我创建了一个自定义DialogPreference,在我的设置中有一个搜索栏对话框,使用默认情况下使用设置活动提供的bindPreferenceSummaryToValue方法将其摘要绑定到其值。 (参见下面的一个)一切正常,但是当第一个设置中的设置时,它没有设置为默认值,而是0,因为0被设置为bindPreferenceSummaryToValue中的后备值。

private static void bindPreferenceSummaryToValue(Preference preference) {
    preference.setOnPreferenceChangeListener(bindPreferenceSummaryToValueListener);
    if (preference instanceof SeekBarPreference) {
        bindPreferenceSummaryToValueListener.onPreferenceChange(preference,
                PreferenceManager.getDefaultSharedPreferences(preference.getContext()).
                        getInt(preference.getKey(), 0));  // Fallback value
    } else {
       ...

在我的自定义DialogPreference中,我有以下方法:

@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
    return a.getInt(index, 0);
}

@Override
protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
    progress= restorePersistedValue ? getPersistedInt(progress) : (int) defaultValue;
}

当然在prefs.xml中我有:

<SeekBarPreference
    android:defaultValue="10"
    android:key="my_key"
    ... />

这在MainActivity中:

PreferenceManager.setDefaultValues(this, R.xml.prefs, false);

当值为null时使用回退值我猜,但如果我将其设置为默认值,为什么它会为null?

1 个答案:

答案 0 :(得分:0)

解决了我的问题:

@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
    return a.getInt(index, 0);
}

@Override
protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
    progress = restorePersistedValue ? getPersistedInt(progress) : (int) defaultValue;
    persistInt(progress);  // ADD THIS HERE
}

原因是当从xml首选项文件设置值时,需要通过首选项本身将其保存到SharedPreferences。这是persistInt的作用。