当一个Activity继承PreferenceActivity后,其中的Preference控件的值会自动的保存到SharedPreferences中,得到这个SharedPreferences的方法:PreferenceManager.getDefaultSharedPreferences(this); 其中获取Preference控件值得key就是控件本身的key。
OnPreferenceChangeListener
作用是当控件的值改变时,阻止SharedPreferences自动改变其值,需要你手动的去响应事件,保存值。
布局test.xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<CheckBoxPreference
android:key="checkbox1"
android:title="CheckBox" />
<Preference
android:key="preference1"
android:summary="请点击"
android:title="Preference" />
</PreferenceScreen>
MainActivity:
public class MainActivity extends PreferenceActivity implements
OnPreferenceChangeListener {
private CheckBoxPreference mCheckBoxPreference;
private SharedPreferences sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.test);
sp = PreferenceManager.getDefaultSharedPreferences(this);
mCheckBoxPreference = (CheckBoxPreference) findPreference("checkbox1");
mCheckBoxPreference.setOnPreferenceChangeListener(this);
}
@Override
protected void onResume() {
// 在onPreferenceChange中设置Summary,如果横屏或者退出,Summary的值会发生异常,在onResume()里再判断一次就好了
super.onResume();
if (mCheckBoxPreference.isChecked()) {
mCheckBoxPreference.setSummary("true");
} else {
mCheckBoxPreference.setSummary("false");
}
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (mCheckBoxPreference == preference) {
String value = newValue.toString();
Toast.makeText(this, value, Toast.LENGTH_SHORT).show();
//第一次安装应用时,是没有SharedPreferences的,所以第二个参数要跟默认值一样
boolean bool = sp.getBoolean("checkbox1", false);
//因为SharedPreferences中值不会改变,所以,要改成相反的值
if (bool) {
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean("checkbox1", false);
editor.commit();
mCheckBoxPreference.setChecked(false);
mCheckBoxPreference.setSummary(value);
} else {
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean("checkbox1", true);
editor.commit();
mCheckBoxPreference.setChecked(true);
mCheckBoxPreference.setSummary(value);
}
return true;//表示新值已成功写入SharedPreferences
}
return false;
}
}
界面变化:
OnPreferenceClickListener
当控件被点击时,先将相应的值写入SharedPreferences,然后触发相应操作
//省略部分代码
private CheckBoxPreference mCheckBoxPreference2;
mCheckBoxPreference2 = (CheckBoxPreference) findPreference("checkbox2");
mCheckBoxPreference2.setOnPreferenceClickListener(this);
protected void onResume(){}//进行summary设置
public boolean onPreferenceClick(Preference preference) {
if (mCheckBoxPreference2 == preference) {
//根据点击后的状态判断
if (mCheckBoxPreference2.isChecked()) {
//点击后如果为true,得到的bool为true
boolean bool = sp.getBoolean("checkbox2", false);
mCheckBoxPreference2.setSummary(bool + "");
} else {
boolean bool = sp.getBoolean("checkbox2", false);
mCheckBoxPreference2.setSummary(bool + "");
}
return true;//完成触发操作
}
return false;
}
还有一个响应OnPreferenceClickListener的方法为onPreferenceTreeClick,
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,Preference preference)
如果返回true,代表已成功执行点击事件,返回false,代表执行默认动作并且返回上层调用链。
注:如果同时调用了上面三种方法,会先调用onPreferenceChange()方法,并且onPreferenceChange()方法独立于其他两种方法,因为我们要先确认是否保存值。然后调用onPreferenceClick()方法,如果该方法返回true,则不再调用onPreferenceTreeClick方法 ;返回false,则继续调用onPreferenceTreeClick方法。