Checkboxpreference .ischecked () Возвращает противоположное значение

StackOverflow https://stackoverflow.com/questions/19848061

  •  29-07-2022
  •  | 
  •  

Вопрос

Я пытаюсь создать свою предпочтительную инъективность, используя фрагменты. У меня есть предпочтения, содержащий две контрольные реферации:

<CheckBoxPreference
    android:key="pref_bfp_scale"
    android:title="@string/PREF_BFP_scale_title"
    android:defaultValue="false" />
<CheckBoxPreference
    android:key="pref_bfp_navy"
    android:title="@string/PREF_BFP_navy_title"
    android:defaultValue="true" />

Моя фрагментировая консиктативность:

public class FragmentSettingsActivity extends PreferenceActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public static class BodyFatPreferenceFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.pref_body_fat);
            bindPrefSumtoValListener(findPreference("pref_bfp_scale"), "Boolean");
            bindPrefSumtoValListener(findPreference("pref_bfp_navy"), "Boolean");
        }
    }

    private static Preference.OnPreferenceChangeListener prefSumtoValListener = new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object value) {
            String stringValue = value.toString();
            log("Pref changed - Value: " + stringValue);

            if (preference instanceof CheckBoxPreference) {
                Map<String, Integer> checkboxes = new HashMap<String, Integer>();

                checkboxes.put("pref_bfp_navy_unchecked", R.string.PREF_BFP_navy_summary_unchecked);
                checkboxes.put("pref_bfp_navy_checked", R.string.PREF_BFP_navy_summary_checked);
                checkboxes.put("pref_bfp_scale_unchecked", R.string.PREF_BFP_scale_summary_unchecked);
                checkboxes.put("pref_bfp_scale_checked", R.string.PREF_BFP_scale_summary_checked);

                log(Boolean.toString(((CheckBoxPreference) preference).isChecked()));
                log(String.format("? : %s_%s", preference.getKey(), ((CheckBoxPreference) preference).isChecked()? "checked" : "unchecked"));

                preference.setSummary(checkboxes.get(String.format("%s_%s", preference.getKey(), ((CheckBoxPreference) preference).isChecked()? "checked" : "unchecked")));
            }

            return true;

        }
    };

    private static void bindPrefSumtoValListener(Preference preference, String type) {
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(preference.getContext());

        preference.setOnPreferenceChangeListener(prefSumtoValListener);

        if (type.equals("Boolean")) {
            prefSumtoValListener.onPreferenceChange(preference, sharedPreferences.getBoolean(preference.getKey(), false));
        }
    }
}

Первый вызов OnPreferenceChange устанавливает резюме должным образом, но каждый другой вызов устанавливает противоположное резюме: если коробка проверена, установлено резюме «без контроля» и наоборот.

Кажется, что ischecked () возвращает какое -то неверное значение, поскольку value.tostring () возвращает правильное состояние в качестве строки.

log () Отпечатки:

log("Pref changed - Value: " + stringValue);
    //Output: Pref changed - Value: true
log(Boolean.toString(((CheckBoxPreference) preference).isChecked()));
    //Output: false
log(String.format("? : %s_%s", preference.getKey(), ((CheckBoxPreference) preference).isChecked()? "checked" : "unchecked"));
    //Output: ? : pref_bfp_navy_unchecked

Где моя ошибка?

Это было полезно?

Решение

От OnPreferenceChangelistener Документы:

Возврат
Верно обновить состояние предпочтения с новым значением.

Из этого можно получить то, что ценность предпочтений на самом деле не меняется, пока слушатель не вернется истинный. Анкет Другими словами, newValue параметр onPreferenceChange() это то, каким будет значение, но не то, чем оно в настоящее время есть (потому что ваша проверка журнала находится внутри слушателя, прежде чем верно будет возвращено).

С другой стороны, я думаю, что цель этого состоит в том, чтобы вы могли отклонить неверное изменение в предпочтения. Например, если предпочтение было строкой, и желательно, чтобы оно приняло только строки из определенного массива принятых значений, разработчик может отклонить изменение, возвращая ложь в onPreferenceChange().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top