Android:CheckBoxPreference组件运用再解

作者 Dinghow 日期 2017-10-19
Android:CheckBoxPreference组件运用再解

最近强行参加了Google的Android挑战赛,从9月18号十分愧疚地在大腿的挂载下“打”完CUMCM,我才开始学习Android怎么写(Orz,万恶的假期拖延症),到10月10日截止时间前二十分钟完成提交,可以说中途一路肝过来,最终做出了一个基本能交,还是不能看的App,很多地方后面有时间再慢慢改,再增添一些新功能。

屁话说了这么多,现在转入正题。

因为Google官方的Materia Design兼容包没有解决PreferenceActivity设置页面的问题,我们这次的App其他Activity均采用了MD风格,为了保证风格一致,参考了这两篇文章的方法

Material Design 风格的设置页面

Android实现Material Design风格的设置页面

通过自己制作相关布局,来达到近似MD化的风格,而在我们的设置页面中,需要用到CheckBoxPreferen这一组件,上网查询了相关文章,发现对其变化事件监听的逻辑写得都略有不足,于是就有了这一文章,算作补充说明:

布局文件中声明一个CheckBoxPreference

<?xml version="1.0" encoding="UTF-8"?>
<PreferenceScreen
android:layout="@layout/preference_item"
android:title="@string/title_activity_setting"
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:layout="@layout/preference_category_widget"
android:title="设置">
<CheckBoxPreference
android:defaultValue="false"
android:key="@string/check_key_1"
android:layout="@layout/preference_item"
android:summaryOff="未开启"
android:summaryOn="已开启"
android:title="开启运动补水" />
</PreferenceCategory>
</PreferenceScreen>

效果图:

rendering

在PreferenceActivity中获取该组件

public class SettingsFragment extends PreferenceFragment {
CheckBoxPreference cp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
cp = (CheckBoxPreference)findPreference(getString(R.string.check_key_1));
}
}

为其设置监听器

cp.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
//将preference转换会CheckboxPreference
CheckBoxPreference checkBoxPreference = (CheckBoxPreference) preference;
//根据状态的改变设置Checkbox的状态
checkBoxPreference.setChecked((boolean)newValue);
PreUtils.putBoolean("user_data","sport_model",(boolean)newValue);
WaterCounter.saveAmount();
return false;
}
});

当CheckBoxPreference被点击,在重写的onPreferenceChange中添加事件,我在这里增加了对补水函数的调用,插一句,目前搜到的很多非官方文档中都忽略了更新复选框状态 setChecked((boolean)newValue),导致点了之后看着没效果,加上即可。

其他preference组件如EditPreference重写点击事件后也应该记得加上setText((String)newValue)来更新状态