我正在尝试使用片段构建我的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的第一次调用正确设置摘要,但每隔一个调用设置相反的摘要:如果选中Box,则设置“未选中”摘要,反之亦然.
似乎isChecked()返回某种错误的值,因为value.toString()以String形式返回正确的状态.
log()打印:
log("Pref changed - Value: " + stringValue); //Output: Pref changed - Value: truelog(Boolean.toString(((CheckBoxPreference) preference).isChecked())); //Output: falselog(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之前,首选项的值实际上不会发生变化.换句话说,onPreferenceChange()的newValue参数是该值的值,但不是它当前的值(因为在返回true之前,您的日志检查在侦听器内部).
在旁注中,我认为这样做的目的是使您能够拒绝对首选项的无效更改.例如,如果首选项是一个字符串,并且希望它只接受来自某个可接受值数组的字符串,则dev可以通过在onPreferenceChange()中返回false来拒绝该更改.
总结以上是内存溢出为你收集整理的android – CheckBoxPreference .isChecked()返回相反的值全部内容,希望文章能够帮你解决android – CheckBoxPreference .isChecked()返回相反的值所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)