原帖地址:http://blog.csdn.net/ichliebephone/article/details/5916320

一.基础知识

我们在使用Android手机时,可能会经常用到其中的设置界面,如下所示:

1Android系统中的设置界面

而且对于我们自己开发的一个完整的程序来说,我们也会需要给用户提供一个设置界面使用户可以对程序的一些参数进行设置。因此,我们就来学习下如何实现符合我们需要的一个设置界面,及其背后的数据持久化功能。

二.实例开发

2.1SharedPreferences

在具体介绍Android的设置界面的实现之前,我们先来介绍一下预备知识,就是Android数据持久化方法中最简单的一种,即使用Preferences的键值对存储方式。这种方式主要用来存储比较简单的一些数据,而且是标准的BooleanIntFloatLongString等类型。

android.content.SharedPreferences是一个接口,用来获取和修改持久化存储的数据。有三种获取系统中保存的持久化数据的方式:

1.publicSharedPreferencesgetPreferences(intmode)

通过Activity对象获取,获取的是本Activity私有的Preference,保存在系统中的xml形式的文件的名称为这个Activity的名字,因此一个Activity只能有一个,属于这个Activity

2.publicSharedPreferencesgetSharedPreferences(Stringname,intmode)

因为Activity继承了ContextWrapper,因此也是通过Activity对象获取,但是属于整个应用程序,可以有多个,以第一参数的name为文件名保存在系统中。

3.publicstaticSharedPreferencesgetDefaultSharedPreferences(Contextcontext)

PreferenceManager的静态函数,保存PreferenceActivity中的设置,属于整个应用程序,但是只有一个,Android会根据包名和PreferenceActivity的布局文件来起一个名字保存。

通过以上方式取得SharedPreferences后就可以对数据进行读取或者保存了。

保存方式如下:

[java] view plain copy print ?
  1. StringSTORE_NAME="Settings";
  2. SharedPreferencessettings=getSharedPreferences(STORE_NAME,MODE_PRIVATE);
  3. SharedPreferences.Editoreditor=settings.edit();
  4. editor.putInt("sourceType",0);
  5. editor.commit();
String STORE_NAME = "Settings"; SharedPreferences settings = getSharedPreferences(STORE_NAME, MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); editor.putInt("sourceType", 0); editor.commit();

获得SharedPreferences,如果需要进行保存等修改操作,首先得通过其edit()方法获得SharedPreferences.Editor,然后就可以通过putIntputString等方法以键值对(key-value)的方式保存数据,或者remove移除某个键(key),及调用clear方法删除所有内容。最后需要调用commit方法是使修改生效。

读取方式如下:

[java] view plain copy print ?
  1. SharedPreferencessettings=getSharedPreferences(STORE_NAME,MODE_PRIVATE);
  2. intsource=settings.getInt("sorceType",1);
SharedPreferences settings = getSharedPreferences(STORE_NAME, MODE_PRIVATE); int source = settings.getInt("sorceType", 1);

读取就更加简单了,只要获得SharedPreferences后,就可以通过getIntgetString等方法获取对应键(key)保存着的数据,如果没有找到key,则返回第二个参数作为默认值。

2.2PreferenceActivity

上面介绍SharedPreferences键值对保存的基础知识,接着我们就可以来实现Android系统的设置界面。Android系统中和设置界面相关的包为android.preference,其中有一个继承了ListActivityPreferenceActivity

下面我们就先实现一个如下图2的最简单的PreferenceActivity设置界面,只有一个CheckBox选择选项,选中时显示“Yes,Iloveyou!”,取消选择时显示“No,Iamsorry.”。然后再介绍其具体的实现。

2PreferenceActivity界面

首先新建一个工程AndroidPreferenceDemo

extendsActivity改为extendsPreferenceActivity

res目录下新建一个xml文件夹,接着在这个文件夹下新建一个取名为preferences.xmlFile文件,内容如下:

[xhtml] view plain copy print ?
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <PreferenceScreen
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:title="Settings">
  5. <CheckBoxPreference
  6. android:title="Loveme?"
  7. android:summaryOn="Yes,Iloveyou!"
  8. android:summaryOff="No,Iamsorry."
  9. android:defaultValue="true">
  10. </CheckBoxPreference>
  11. </PreferenceScreen>
<?xml version="1.0" encoding="UTF-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="Settings"> <CheckBoxPreference android:title="Love me?" android:summaryOn="Yes,I love you!" android:summaryOff="No,I am sorry." android:defaultValue="true"> </CheckBoxPreference> </PreferenceScreen>

然后把java文件中的setContentView(R.layout.main);改为

addPreferencesFromResource(R.xml.preferences);

完成了,最后可以运行试下效果。

Java文件的实现很简单,继承PreferenceActivity后,调用其publicvoidaddPreferencesFromResource(intpreferencesResId)

方法从一个xml文件中获取preference然后显示为标准的设置界面。

因此我们只要在xml文件中布局好要显示的设置界面内容就可以了。

下面我们看下布局文件xml的内容。

对应的xml中可以使用的标签(Tag)可以分为两类,一类是管理布局的显示,如PreferenceScreen;另一类是具体的设置内容,如CheckBoxPreference

PreferenceScreen可以显示一个完整的页面,可以嵌套,包含在PreferenceScreen标签里的内容都将以一个完整的页面显示。

我们学习一个PreferenceScreen的界面,如下图3所示。

3PreferenceScreen相关的布局

当点击左图的选项时,分别会以新的页面显示,如中间和右图所示。

上面页面对应的xml布局文件如下所示:

[xhtml] view plain copy print ?
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <PreferenceScreen
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:title="Settings">
  5. <PreferenceScreen
  6. xmlns:android="http://schemas.android.com/apk/res/android"
  7. android:title="Emotions"
  8. android:summary="settingsaboutemotions">
  9. <CheckBoxPreference
  10. android:title="Loveme?"
  11. android:summaryOn="Yes,Iloveyou!"
  12. android:summaryOff="No,Iamsorry."
  13. android:defaultValue="true">
  14. </CheckBoxPreference>
  15. <CheckBoxPreference
  16. android:title="Hateme?"
  17. android:summaryOn="Yes,Ihateyou!"
  18. android:summaryOff="No,youareagoodperson."
  19. android:defaultValue="false">
  20. </CheckBoxPreference>
  21. </PreferenceScreen>
  22. <PreferenceScreen
  23. xmlns:android="http://schemas.android.com/apk/res/android"
  24. android:title="Relations"
  25. android:summary="settingsaboutrelations">
  26. <CheckBoxPreference
  27. android:title="Family?"
  28. android:summaryOn="Yes,wearefamily!"
  29. android:summaryOff="No,Iamsorry."
  30. android:defaultValue="true">
  31. </CheckBoxPreference>
  32. <CheckBoxPreference
  33. android:title="Friends?"
  34. android:summaryOn="Yes,wearefriends!"
  35. android:summaryOff="No,Iamsorry."
  36. android:defaultValue="false">
  37. </CheckBoxPreference>
  38. </PreferenceScreen>
  39. </PreferenceScreen>
<?xml version="1.0" encoding="UTF-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="Settings"> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="Emotions" android:summary="settings about emotions"> <CheckBoxPreference android:title="Love me?" android:summaryOn="Yes,I love you!" android:summaryOff="No,I am sorry." android:defaultValue="true"> </CheckBoxPreference> <CheckBoxPreference android:title="Hate me?" android:summaryOn="Yes,I hate you!" android:summaryOff="No,you are a good person." android:defaultValue="false"> </CheckBoxPreference> </PreferenceScreen> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="Relations" android:summary="settings about relations"> <CheckBoxPreference android:title="Family?" android:summaryOn="Yes,we are family!" android:summaryOff="No,I am sorry." android:defaultValue="true"> </CheckBoxPreference> <CheckBoxPreference android:title="Friends?" android:summaryOn="Yes,we are friends!" android:summaryOff="No,I am sorry." android:defaultValue="false"> </CheckBoxPreference> </PreferenceScreen> </PreferenceScreen>

和管理布局显示相关的除了PreferenceScreen外,还有一个常用的为PreferenceCategory,我们把上面xml文件中间那两个PreferenceScreen改为PreferenceCategory就可以看到PreferenceCategory的显示效果了,如下图4所示。

4PreferenceCategory相关的布局

可以看到PreferenceCategory是把包含的内容归为同一类,但只是显示在一个页面中。


管理布局相关的两个标签可以使设置内容显示的更有条理,但是更主要的还是具体设置相关的标签,除了我们已经在使用的用于二选一的CheckBoxPreference外,Android系统提供的还有以对话框显示的DialogPreference,可以输入文本的EditTextPreference,以列表方式显示供选择的ListPreference和设置铃声用的RingtonePreference

下面我们选择比较常用的ListPreference来介绍下具体使用。

首先在res/values/文件夹下新建一个取名为array.xml的文件,内容为:

[xhtml] view plain copy print ?
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <!--系统设置界面需要要到的数组-->
  4. <string-arrayname="auto_update_frequency_entry">
  5. <item>10分钟</item>
  6. <item>30分钟</item>
  7. <item>1小时</item>
  8. <item>12小时</item>
  9. <item>24小时</item>
  10. </string-array>
  11. <string-arrayname="auto_update_frequency_value">
  12. <item>10</item>
  13. <item>30</item>
  14. <item>60</item>
  15. <item>720</item>
  16. <item>1440</item>
  17. </string-array>
  18. </resources>
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- 系统设置界面需要要到的数组 --> <string-array name="auto_update_frequency_entry"> <item>10分钟</item> <item>30分钟</item> <item>1小时</item> <item>12小时</item> <item>24小时</item> </string-array> <string-array name="auto_update_frequency_value"> <item>10</item> <item>30</item> <item>60</item> <item>720</item> <item>1440</item> </string-array> </resources>

然后在res/values/strings.xml文件中添加

[xhtml] view plain copy print ?
  1. <!--统设置界面需要要到的字符串-->
  2. <stringname="system_settings">系统设置</string>
  3. <stringname="auto_update_setting">自动更新设置</string>
  4. <stringname="auto_update_switch_title">自动更新</string>
  5. <stringname="auto_update_switch_key">auto_update_switch</string>
  6. <stringname="auto_update_switch_summary_on">开启自动更新</string>
  7. <stringname="auto_update_switch_summary_off">关闭自动更新</string>
  8. <stringname="auto_update_frequency_title">更新频率</string>
  9. <stringname="auto_update_frequency_key">auto_update_frequency</string>
  10. <stringname="auto_update_frequency_default_value">10</string>
  11. <stringname="auto_update_frequency_summary">设置自动更新的时间周期</string>
  12. <stringname="cancel">取消</string>
<!-- 统设置界面需要要到的字符串 --> <string name="system_settings">系统设置</string> <string name="auto_update_setting">自动更新设置</string> <string name="auto_update_switch_title">自动更新</string> <string name="auto_update_switch_key">auto_update_switch</string> <string name="auto_update_switch_summary_on">开启自动更新</string> <string name="auto_update_switch_summary_off">关闭自动更新</string> <string name="auto_update_frequency_title">更新频率</string> <string name="auto_update_frequency_key">auto_update_frequency</string> <string name="auto_update_frequency_default_value">10</string> <string name="auto_update_frequency_summary">设置自动更新的时间周期</string> <string name="cancel">取消</string>

需要的数据现在准备好了,下面我们来完成对应的xml文件。xml文件中各个标签的属性比较多,虽然Android有代码自动补全功能,但是还是使用Android提供的Structure界面来填写比较方便,下面我们就以这个方式来完成。

res/xml文件夹下新建一个AndroidXMLFile文件,取名为preferencesii.xml,类型选择PreferenceRootElement选择PreferenceScreen。 在Structure方式显示时,就会列出选中标签的所有属性,然后就可以根据需要填写属性,如下图5所示:

5填写xmlPreference的属性

从上图我们可以看到一个Preference拥有的属性。其中Key为这个PreferenceID,设置了才可以在代码中引用,Title是显示的标题,Summary是显示在标题下的文字介绍,一般在Dependency中填写一个CheckBoxPreferenceKey,这样就会在填写的那个CheckBoxPreference勾选时当前这个Preference才可用,DefaultValue为初始值,等等。

点击“Add”按钮,就会添加新的标签,我们依次添加一个CheckBoxPreferenceListPreference。属于CheckBoxPreference的特有属性主要为SummaryOnSummaryOff,比较好理解。下面具体来看下ListPreference属性的填写:

6ListPreference的属性

我们可以看到,ListPreference除了继承自Preference的属性外,还有自己ListPreference的属性和继承自DialogPreference的属性。其中属于ListPreference的属性有两个:Entries填的为一个字符串数组,是列表显示出来的值,而EntryValues是长度对应的字符串数组,是和Entries对应的具体的值。DialogPreference只要填一个Dialogtitle标题和一个取消按钮显示的字即可。在Preference属性的Dependency中我们填写上面一个CheckBoxPreferenceKey,这样就会只有在CheckBoxPreference勾选时这个ListPreference才有效。

7完整的xml显示

最后把java文件中的addPreferencesFromResource(R.xml.preferences);改为addPreferencesFromResource(R.xml.preferencesii);

保存运行,看下效果。

8ListPreference显示

2.3OnPreferenceChangeListener

以上我们分别介绍了Preference对数据的保存及PreferenceActivity设置界面。当PreferenceActivity中的内容改变时,Android系统会自动进行保存和持久化维护,我们只需要在要用的设置界面中数据的地方进行读取就可以了。同时Android还提供了OnPreferenceClickListenerOnPreferenceChangeListener两个与Preference相关的监听接口,当PreferenceActivity中的某一个Preference进行了点击或者改变的操作时,都会回调接口中的函数,这样可以第一个时间向其他Activity等通知系统设置进行了改变。

下面我们以一个具体的Demo说明PreferenceActivity和其监听接口的使用。

新建一个工程AndroidPreferenceDemoII,并按上面的步骤添加xml文件夹和其内容Preferenceii.xml,还有values文件夹中的array.xmlstrings.xml

新建一个名为Settingsclass,内容为:

[java] view plain copy print ?
  1. //继承PreferenceActivity,并实现OnPreferenceChangeListener和OnPreferenceClickListener监听接口
  2. publicclassSettingsextendsPreferenceActivityimplementsOnPreferenceChangeListener,
  3. OnPreferenceClickListener{
  4. //定义相关变量
  5. StringupdateSwitchKey;
  6. StringupdateFrequencyKey;
  7. CheckBoxPreferenceupdateSwitchCheckPref;
  8. ListPreferenceupdateFrequencyListPref;
  9. @Override
  10. publicvoidonCreate(BundlesavedInstanceState){
  11. super.onCreate(savedInstanceState);
  12. //从xml文件中添加Preference项
  13. addPreferencesFromResource(R.xml.preferencesii);
  14. //获取各个Preference
  15. updateSwitchKey=getResources().getString(R.string.auto_update_switch_key);
  16. updateFrequencyKey=getResources().getString(R.string.auto_update_frequency_key);
  17. updateSwitchCheckPref=(CheckBoxPreference)findPreference(updateSwitchKey);
  18. updateFrequencyListPref=(ListPreference)findPreference(updateFrequencyKey);
  19. //为各个Preference注册监听接口
  20. updateSwitchCheckPref.setOnPreferenceChangeListener(this);
  21. updateSwitchCheckPref.setOnPreferenceClickListener(this);
  22. updateFrequencyListPref.setOnPreferenceChangeListener(this);
  23. updateFrequencyListPref.setOnPreferenceClickListener(this);
  24. }
  25. @Override
  26. publicbooleanonPreferenceChange(Preferencepreference,ObjectnewValue){
  27. //TODOAuto-generatedmethodstub
  28. Log.v("SystemSetting","preferenceischanged");
  29. Log.v("Key_SystemSetting",preference.getKey());
  30. //判断是哪个Preference改变了
  31. if(preference.getKey().equals(updateSwitchKey))
  32. {
  33. Log.v("SystemSetting","checkboxpreferenceischanged");
  34. }
  35. elseif(preference.getKey().equals(updateFrequencyKey))
  36. {
  37. Log.v("SystemSetting","listpreferenceischanged");
  38. }
  39. else
  40. {
  41. //如果返回false表示不允许被改变
  42. returnfalse;
  43. }
  44. //返回true表示允许改变
  45. returntrue;
  46. }
  47. @Override
  48. publicbooleanonPreferenceClick(Preferencepreference){
  49. //TODOAuto-generatedmethodstub
  50. Log.v("SystemSetting","preferenceisclicked");
  51. Log.v("Key_SystemSetting",preference.getKey());
  52. //判断是哪个Preference被点击了
  53. if(preference.getKey().equals(updateSwitchKey))
  54. {
  55. Log.v("SystemSetting","checkboxpreferenceisclicked");
  56. }
  57. elseif(preference.getKey().equals(updateFrequencyKey))
  58. {
  59. Log.v("SystemSetting","listpreferenceisclicked");
  60. }
  61. else
  62. {
  63. returnfalse;
  64. }
  65. returntrue;
  66. }
  67. }
//继承PreferenceActivity,并实现OnPreferenceChangeListener和OnPreferenceClickListener监听接口 public class Settings extends PreferenceActivity implements OnPreferenceChangeListener, OnPreferenceClickListener{ //定义相关变量 String updateSwitchKey; String updateFrequencyKey; CheckBoxPreference updateSwitchCheckPref; ListPreference updateFrequencyListPref; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //从xml文件中添加Preference项 addPreferencesFromResource(R.xml.preferencesii); //获取各个Preference updateSwitchKey = getResources().getString(R.string.auto_update_switch_key); updateFrequencyKey = getResources().getString(R.string.auto_update_frequency_key); updateSwitchCheckPref = (CheckBoxPreference)findPreference(updateSwitchKey); updateFrequencyListPref = (ListPreference)findPreference(updateFrequencyKey); //为各个Preference注册监听接口 updateSwitchCheckPref.setOnPreferenceChangeListener(this); updateSwitchCheckPref.setOnPreferenceClickListener(this); updateFrequencyListPref.setOnPreferenceChangeListener(this); updateFrequencyListPref.setOnPreferenceClickListener(this); } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { // TODO Auto-generated method stub Log.v("SystemSetting", "preference is changed"); Log.v("Key_SystemSetting", preference.getKey()); //判断是哪个Preference改变了 if(preference.getKey().equals(updateSwitchKey)) { Log.v("SystemSetting", "checkbox preference is changed"); } else if(preference.getKey().equals(updateFrequencyKey)) { Log.v("SystemSetting", "list preference is changed"); } else { //如果返回false表示不允许被改变 return false; } //返回true表示允许改变 return true; } @Override public boolean onPreferenceClick(Preference preference) { // TODO Auto-generated method stub Log.v("SystemSetting", "preference is clicked"); Log.v("Key_SystemSetting", preference.getKey()); //判断是哪个Preference被点击了 if(preference.getKey().equals(updateSwitchKey)) { Log.v("SystemSetting", "checkbox preference is clicked"); } else if(preference.getKey().equals(updateFrequencyKey)) { Log.v("SystemSetting", "list preference is clicked"); } else { return false; } return true; } }

主要是获取xml文件中的各个Preference,然后为其注册监听接口,最后在监听接口的回调函数中打印相关的信息。

接着在Manifest文件中对这个Activity进行注册:

[xhtml] view plain copy print ?
  1. <activityandroid:name=".Settings">
  2. </activity>
<activity android:name=".Settings"> </activity>

然后对AndroidPreferenceDemoII.java文件进行如下修改:

[java] view plain copy print ?
  1. publicclassAndroidPreferenceDemoIIextendsActivity{
  2. /**Calledwhentheactivityisfirstcreated.*/
  3. //菜单项
  4. finalprivateintmenuSettings=Menu.FIRST;
  5. privatestaticfinalintREQ_SYSTEM_SETTINGS=0;
  6. @Override
  7. publicvoidonCreate(BundlesavedInstanceState){
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.main);
  10. }
  11. //创建菜单
  12. @Override
  13. publicbooleanonCreateOptionsMenu(Menumenu)
  14. {
  15. //建立菜单
  16. menu.add(0,menuSettings,2,"设置");
  17. returnsuper.onCreateOptionsMenu(menu);
  18. }
  19. //菜单选择事件处理
  20. @Override
  21. publicbooleanonMenuItemSelected(intfeatureId,MenuItemitem)
  22. {
  23. switch(item.getItemId())
  24. {
  25. casemenuSettings:
  26. //转到Settings设置界面
  27. startActivityForResult(newIntent(this,Settings.class),REQ_SYSTEM_SETTINGS);
  28. break;
  29. default:
  30. break;
  31. }
  32. returnsuper.onMenuItemSelected(featureId,item);
  33. }
  34. //Settings设置界面返回的结果
  35. protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
  36. if(requestCode==REQ_SYSTEM_SETTINGS)
  37. {
  38. //获取设置界面PreferenceActivity中各个Preference的值
  39. StringupdateSwitchKey=getResources().getString(R.string.auto_update_switch_key);
  40. StringupdateFrequencyKey=getResources().getString(R.string.auto_update_frequency_key);
  41. //取得属于整个应用程序的SharedPreferences
  42. SharedPreferencessettings=PreferenceManager.getDefaultSharedPreferences(this);
  43. BooleanupdateSwitch=settings.getBoolean(updateSwitchKey,true);
  44. StringupdateFrequency=settings.getString(updateFrequencyKey,"10");
  45. //打印结果
  46. Log.v("CheckBoxPreference_Main",updateSwitch.toString());
  47. Log.v("ListPreference_Main",updateFrequency);
  48. }
  49. else
  50. {
  51. //其他Intent返回的结果
  52. }
  53. }
  54. }
public class AndroidPreferenceDemoII extends Activity { /** Called when the activity is first created. */ // 菜单项 final private int menuSettings=Menu.FIRST; private static final int REQ_SYSTEM_SETTINGS = 0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } //创建菜单 @Override public boolean onCreateOptionsMenu(Menu menu) { // 建立菜单 menu.add(0, menuSettings, 2, "设置"); return super.onCreateOptionsMenu(menu); } //菜单选择事件处理 @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { switch (item.getItemId()) { case menuSettings: //转到Settings设置界面 startActivityForResult(new Intent(this, Settings.class), REQ_SYSTEM_SETTINGS); break; default: break; } return super.onMenuItemSelected(featureId, item); } //Settings设置界面返回的结果 protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == REQ_SYSTEM_SETTINGS) { //获取设置界面PreferenceActivity中各个Preference的值 String updateSwitchKey = getResources().getString(R.string.auto_update_switch_key); String updateFrequencyKey = getResources().getString(R.string.auto_update_frequency_key); //取得属于整个应用程序的SharedPreferences SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); Boolean updateSwitch = settings.getBoolean(updateSwitchKey, true); String updateFrequency = settings.getString(updateFrequencyKey, "10"); //打印结果 Log.v("CheckBoxPreference_Main", updateSwitch.toString()); Log.v("ListPreference_Main", updateFrequency); } else { //其他Intent返回的结果 } } }

主要是添加一个设置菜单,点击后转到设置界面,当从设置界面返回后读取保存的内容,并打印出来查看。

最后我们看一下运行的效果:

9设置界面操作

操作的Log输出如下图10所示:

10DDMSLogCat输出

点击设置菜单转到设置界面后,首先点击CheckBox,输出前6行,然后点击ListPreference,输出3行,当选择列表的第二个进行改变时,再输出3行,最后按返回键回到第一个页面,打印出最后2行。

最后我们看一下这些设置参数在系统中的保存文件。在DDMSFileExplorer中,查看data/data/com.ichliebephone文件夹,我们可以看到有如下文件:

11Preference保存的文件

把这个文件导出到电脑上,可以看到起内容为:

[xhtml] view plain copy print ?
  1. <?xmlversion='1.0'encoding='utf-8'standalone='yes'?>
  2. <map>
  3. <stringname="auto_update_frequency">30</string>
  4. <booleanname="auto_update_switch"value="true"/>
  5. </map>
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="auto_update_frequency">30</string> <boolean name="auto_update_switch" value="true" /> </map>

文件以map的方式保存了两个设置参数

三.总结

我们学习了AndroidPreference相关内容,包括最基本的SharedPreferences的使用,及进一步的PreferenceActivity设置界面的介绍,最后根据以上的内容完成了一个简单的Demo

Preference键值对的方式是Android最简单的一种数据持久化方式,虽然比较简单,但是也比较实用,特别是在保存小量的数据时。Android上的功能更加强大相对也更加复杂的SQLite数据保存方式我们以后接着学习。


续:

重点:分析Preference事件

PreferenceActivity方法中,一个比较重要的监听点击事件方法为:

publicbooleanonPreferenceTreeClick(PreferenceScreen preferenceScreen,Preference preference)

说明:当Preference控件被点击时,触发该方法。

参数说明: preference点击的对象。

返回值: true 代表点击事件已成功捕捉,无须执行默认动作或者返回上层调用链。例如,不跳转至默认Intent。false 代表执行默认动作并且返回上层调用链。例如,跳转至默认Intent。

在我们继承PreferenceActivity的Activity可以重写该方法,来完成我们对Preference事件的捕捉。

Preference相关的两个重要监听接口。

1Preference.OnPreferenceChangeListener 该监听器的一个重要方法如下:

boolean onPreferenceChange(Preference preference,Object objValue)

说明: 当Preference的元素值发送改变时,触发该事件。

返回值:true 代表将新值写入sharedPreference文件中。false 则不将新值写入sharedPreference文件

2Preference.OnPreferenceClickListener。该监听器的一个重要方法如下:

publicbooleanonPreferenceClick(Preference preference)

说明:当点击控件时触发发生,可以做相应操作。

那么当一个Preference控件实现这两个接口时,当被点击或者值发生改变时,触发方法是如何执行的呢?事实上,

它的触发规则如下:

1先调用onPreferenceClick()方法,如果该方法返回true,则不再调用onPreferenceTreeClick方法 ;

如果onPreferenceClick方法返回false,则继续调用onPreferenceTreeClick方法。

2onPreferenceChange的方法独立与其他两种方法的运行。也就是说,它总是会运行。

下面写个小例子描述下具体实现步骤:

1在res下建立xml文件夹,并在内建立Preference.xml文件。PreferenceScreen是根节点。

<?xmlversion="1.0"encoding="utf-8"?>

<PreferenceScreenxmlns:android="http://schemas.android.com/apk/res/android"

android:title="@string/preferences">

<PreferenceScreen

android:key="version"

android:title="@string/about">

</PreferenceScreen>

<PreferenceScreen

android:key="general"

android:title="@string/settings">

<CheckBoxPreference

android:key="auto_start"

android:title="@string/auto_start"/>

<CheckBoxPreference

android:key="keep_screen_on"

android:summary="@string/keep_screen_on_summary"

android:title="@string/keep_screen_on"/>

<CheckBoxPreference

android:key="general_show_icon_in_status_bar"

android:title="@string/show_icon_in_status_bar" />

<PreferenceScreen

android:key="font"

android:title="@string/fonts">

</PreferenceScreen>

<ListPreference

android:key="start_display"

android:title="@string/start_display"

android:summary="Select an option"

android:entries="@array/start_display"

android:entryValues="@array/start_display_entries"

android:dialogTitle="@string/start_display_title"/>

</PreferenceScreen>

</PreferenceScreen>

2在src下建立java文件Preference.java并继承PreferenceActivity。部分结构代码:

publicvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

addPreferencesFromResource(R.xml.preferences);

fonts = (PreferenceScreen) findPreference("font");

startDisplay=(PreferenceScreen)findPreference("start_display");

setFilePath = (PreferenceScreen) findPreference("SetFilePath");

setVolume =(PreferenceScreen) findPreference("SetVolume");

}

3Preference.java中写事件。可以用Preference的内置控件,也可以在PreferenceScreen中写单击事件。

publicboolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,

Preference preference) {

if (preference ==version) { // 版本号

DialogAdapter dialogadapter = new DialogAdapter(this);

dialogadapter.showTipsDialog();

} elseif (preference ==autoStart) { // 开机自启动事件

editor.putBoolean(AUTO_START_STATUS,autoStart.isChecked());

editor.commit();

} elseif (preference ==keepScreenOn) {// 保持屏幕

editor.putBoolean(KEEP_SCREEN_ON,keepScreenOn.isChecked());

editor.commit();

if (keepScreenOn.isChecked()){

AlarmAlertWakeLock.acquireScreenWakeLock(this);

} else {

AlarmAlertWakeLock.release();

}

}

returnsuper.onPreferenceTreeClick(preferenceScreen, preference);

}

看效果:

疑问

在用listPreference中点击listPreference就开始把上次设置的数据保存在sharePreference中,然而在弹出Listdialog选择时却不会保存,不知道为什么?都最后只能放弃listPreference,自己写事件获得数据。请高人指点!



更多相关文章

  1. android中Invalidate和postInvalidate的区别
  2. android中javah生成jni头文件报错问题
  3. Android(安卓)反编译apk 到java源码的方法
  4. 双击运行Android模拟器、创建SDcard、AVD、安装APK文件、上传文
  5. Android横竖屏切换总结
  6. Android(安卓)Studio添加第三方库遇到的一些坑
  7. 最全的Android项目结构以及功能
  8. Android中的windowSoftInputMode属性详解
  9. NPM 和webpack 的基础使用

随机推荐

  1. mongoDB入门系列之配置解释及错误汇总
  2. 使用jenkins构建自动化发布系统之构建jen
  3. php常用数组函数
  4. 在centos7上安装kvm虚拟机
  5. IPFS挖矿靠谱吗?
  6. IPFS挖矿赚钱吗?IPFS挖矿是真的吗?
  7. 运维的尴尬瞬间
  8. IPFS挖矿硬盘满了会怎样?
  9. CentOS 7部署OpenStack--部署Newtron(计
  10. IPFS矿池集群方案详解