문제

나는 조각을 사용하여 선호도를 구축하려고합니다. 두 개의 checkboxpreferences를 포함하는 선호도가 있습니다.

<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" />

내 FragmentsettingSactivity :

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의 첫 번째 호출은 요약을 올바르게 설정하지만 다른 모든 호출은 반대 요약을 설정합니다. 상자를 확인하면 "확인되지 않은"요약이 설정되고 그 반대도 마찬가지입니다.

value.tostring ()은 올바른 상태를 문자열로 반환하기 때문에 ischecked ()가 어떤 종류의 잘못된 값을 반환하는 것 같습니다.

로그 () 인쇄 :

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() 가치가 될 것입니다. 그러나 현재는 아직 그렇지 않습니다 (로그 검사가 리스너 내부에 있기 때문에 True가 반환되기 전에).

참고로, 나는 이것의 목적은 당신이 선호도에 대한 잘못된 변화를 거부 할 수 있다는 것입니다. 예를 들어, 기본 설정이 문자열 인 경우, 수용된 특정 배열의 문자열 만 허용하는 것이 바람직한 경우, Dev는 False를 반환하여 변경을 거부 할 수 있습니다. onPreferenceChange().

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top