gpt4 book ai didi

android - CheckBoxPreference .isChecked() 返回相反的值

转载 作者:太空宇宙 更新时间:2023-11-03 12:35:47 29 4
gpt4 key购买 nike

我正在尝试使用 fragment 构建我的 PreferenceActivity。我有一个包含两个 CheckBoxPreferences 的 PreferenceFragment:

<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 的第一次调用正确设置了摘要,但其他所有调用都设置了相反的摘要:如果选中该框,则设置“未选中”摘要,反之亦然。

似乎 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文档:

Returns
True to update the state of the Preference with the new value.

从这里可以收集到的是,在监听器返回 true 之前,偏好的值实际上并没有改变。换句话说,newValue onPreferenceChange() 的参数是值的值,但不是当前值(因为您的日志检查在监听器内部,在返回 true 之前)。

附带说明一下,我认为这样做的目的是让您能够拒绝对首选项的无效更改。例如,如果首选项是一个字符串,并且希望它只接受来自特定接受值数组的字符串,则开发人员可以通过在 onPreferenceChange() 中返回 false 来拒绝更改。 .

关于android - CheckBoxPreference .isChecked() 返回相反的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19848061/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com