Android的数据存储之SharedPreferences2——使用PreferenceActivity实现设置界面
PreferenceActivity是Activity的子类,可以方便的实现设置界面。
PreferenceActivity会通过一个xml配置文件来描述设置界面,并且系统会自动保存当前设置的最后状态。
使用步骤:
1、编写一个类继承自PreferenceActivity的子类。
//默认会把key-value 存储在 包.xml中。再次访问Activity时,也是默认从 包.xml中读取
addPreferencesFromResource(R.xml.pref);
2、在res/xml目录中建立一个用于描述设置界面的xml文件
a,新建一个xml目录
b,新建一个pref.xml
c、创建如下结果的文件
显示结果如下:
重新进入后保存了之前设置的值,因为PreferenceActivity中,会默认读取 包.xml 来设置默认值。
问题一:可否修改PreferenceActivity保存数据的文件名。
答:PreferenceActivity内部使用了SharedPreferences对象保存数据,默认存储路径和文件名都和后者相同,路径是:shared_prefs/包.xml .
getPreferenceManager().setSharedPreferencesName("setting");
上述方法修改默认的文件名为 setting.xml 但是需要注意的是,文件名修改后,重新访问这个Activity的时候不会自动读取setting.xml中的文件。因为默认读取的是 包.xml 这个文件,故建议不修改。
问题二: 上面案例中的EditTextPreference 中,填写用户名后点击确定,页面摘要地方不显示输入内容。
public class MainActivity3 extends PreferenceActivity {
SharedPreferences pref;
EditTextPreference etp, etp_phone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref);
// getPreferenceManager().setSharedPreferencesName("setting");
try {
etp = (EditTextPreference) findPreference("individual_name");
etp.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference,
Object newValue) {
preference.setSummary(newValue.toString());
return true; // 是否写入xml
}
});
etp_phone = (EditTextPreference) findPreference("mobile");
etp_phone
.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(
Preference preference, Object newValue) {
preference.setSummary(newValue.toString());
return true;
}
});
ListPreference list = (ListPreference) findPreference("list_sort");
// OnSharedPreferenceChanged监听事件必须进行注册
list.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference,
Object newValue) {
String[] ss = getResources().getStringArray(
R.array.pref_entries);
preference.setSummary("Current value is "
+ ss[Integer.parseInt(newValue.toString()) - 1]);
return true;// 是否写入xml
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
说明:本文参照李宁老师的《Android高薪之路》