PRELOADER

Dinghow的个人博客

Current post : 《Android:CheckBoxPreference组件运用再解》

12/4/2018 —— 

最近强行参加了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>

效果图:

This is an example image

在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)来更新状态