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高薪之路》