質問

フラグメントを使用して優先反応性を構築しようとしています。 2つの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));
        }
    }
}

inpreferencechangeの最初の呼び出しは概要を適切に設定しますが、他のすべての呼び出しは反対の要約を設定します。ボックスがチェックされている場合、「チェックされていない」要約が設定され、その逆も同様です。

value.toString()が正しい状態を文字列として返すため、ischecked()は何らかの間違った値を返すようです。

log()prints:

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

私の間違いはどこにありますか?

役に立ちましたか?

解決

から inpreferencechAngelistener ドキュメント:

戻り値
新しい値で好みの状態を更新するのに忠実です。

これから収集できるのは、リスナーが戻るまで好みの価値が実際には変わらないということです 真実. 。言い換えれば、 newValue のパラメーター onPreferenceChange() 値はどうなるかですが、現在のものではありません(ログチェックがリスナーの内側にあり、trueが返される前)。

補足的には、これの目的は、あなたが好みに対する無効な変更を拒否できるようにすることだと思います。たとえば、好みが文字列であり、受け入れられた値の特定の配列からの文字列のみを受け入れることが望ましい場合、開発者はfalseを返すことで変更を拒否できます。 onPreferenceChange().

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top