Android的SharedPreferences和PreferenceActivity用法

  

 
本文主要介绍SharedPreferences和PreferenceActivity的用法。

    主要资料来源于网络,包括但不限于:

Android之PreferenceActivity

在Android中Preferences数据存储的使用

Android的设置界面及Preference使用

OnPreferenceChangeListener分析,以及与OnPreferenceClickListener的区别

使用PreferenceActivity时,如何获取ListPreference中选中的值》。

1、android文件存储

        对Android系统了解的都知道,Android系统有四种基本的数据保存方法,一是SharedPreference,二是文件,三是SQLite,四是ContentProvider。看出来了吧,Preference,对就是使用SharedPreferneces以键值对的形式进行保存的。

2、SharedPreferneces

        做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等耗时大大影响了程序的效率,因此我们使用键值这种一一对应的关系来存放这些配置信息。SharedPreferences正是Android中用于实现这中存储方式的技术。
        SharedPreferences是以键值对的形式存储数据的,其使用非常简单,能够轻松的存放数据和读取数据。

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

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

        1). public SharedPreferences getPreferences (int mode)
通过Activity对象获取,获取的是本Activity私有的Preference,保存在系统中的xml形式的文件的名称为这个Activity的名字,因此一个Activity只能有一个,属于这个Activity。
        2). public SharedPreferences getSharedPreferences (String name, int mode)
因为Activity继承了ContextWrapper,因此也是通过Activity对象获取,但是属于整个应用程序,可以有多个,以第一参数的name为文件名保存在系统中。
        3). public static SharedPreferences getDefaultSharedPreferences (Context context)
PreferenceManager的静态函数,保存PreferenceActivity中的设置,属于整个应用程序,但是只有一个,Android会根据包名和PreferenceActivity的布局文件来起一个名字保存。
        通过以上方式取得SharedPreferences后就可以对数据进行读取或者保存了。
        保存方式如下:

[java] view plaincopy

  1. String STORE_NAME = “Settings”;    
  2. SharedPreferences settings = getSharedPreferences(STORE_NAME, MODE_PRIVATE);    
  3. SharedPreferences.Editor editor = settings.edit();    
  4. editor.putInt(“sourceType”0);    
  5.  editor.commit();    

     

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

[java] view plaincopy

  1. SharedPreferences settings = getSharedPreferences(STORE_NAME, MODE_PRIVATE);    
  2.  int source = settings.getInt(“sorceType”1);    

      

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

2、PreferencesActivity

        在Android开发过程中我们有很大的机会需要用到参数设置功能,那么在Android应用中,我们如何实现参数设置界面及参数存储呢,下面我们来介绍一下Android中的一个特殊Activity–PreferencesActivity。
        PreferencesActivity是Android中专门用来实现程序设置界面及参数存储的一个Activity。

2.1 创建PreferencesActivity

        如何创建一个PreferenceActivity。 其实Eclipse提供了相应的创建工具,和创建Layout是基本相同的。步骤如下:
创建Android项目,并添加一个Android xml文件。注意,这次选择的不是Layout,而是Preference,而且注意Folder路径是 res/xml.

《Android的SharedPreferences和PreferenceActivity用法》
        添加完成之后,在res/xml/下打开添加的preference.xml文件。可以看到Android也为我们提供两种编辑模式,可视化的结构设计及xml源码设计。推荐使用structure进行创建。如图所示:

《Android的SharedPreferences和PreferenceActivity用法》

2.2 PrefeneceActivity的基本组成

        下面我们看看PrefeneceActivity都提供了哪几种元素可供使用。点击Add按钮,在打开的新窗口中可以看到以下几项:

《Android的SharedPreferences和PreferenceActivity用法》

CheckBoxPreference:CheckBox选择项,对应的值的ture或flase。如图:

《Android的SharedPreferences和PreferenceActivity用法》

EditTextPreference:输入编辑框,值为String类型,会弹出对话框供输入。

《Android的SharedPreferences和PreferenceActivity用法》

ListPreference: 列表选择,弹出对话框供选择。

《Android的SharedPreferences和PreferenceActivity用法》

Preference:只进行文本显示,需要与其他进行组合使用。

《Android的SharedPreferences和PreferenceActivity用法》

PreferenceCategory:用于分组。效果如下:

《Android的SharedPreferences和PreferenceActivity用法》

PreferenceScreen:PreferenceActivity的根元素,必须为它。
RingtonePreference:系统玲声选择。

《Android的SharedPreferences和PreferenceActivity用法》

        OK,Preferenc的基本元素介绍完毕,下一节将使用它们创建一个完整的Preference并进行显示。

2.3 PreferenceActivity实例

        分析MusicPlayer Setting,第一部分为“我的位置”,包括“使用无线网线”和“使用GPS”两个部分,而且都是CheckBox,根据上节学习,应该包括一个PreferenceCategory和两个CheckBoxPreference。
Xml代码

[html] view plaincopy

  1. <PreferenceCategory android:title=“我的位置” android:key=“set_local”>  
  2.     <CheckBoxPreference android:key=“apply_wifi”  
  3.         android:summary=“使用无线网络在应用程序(例如Google地图)中查看位置”   
  4.                 android:title=“使用无线网络” android:defaultValue=“true”>  
  5.     </CheckBoxPreference>  
  6.     <CheckBoxPreference android:key=“apply_gps”  
  7.         android:summary=“定位到街道级别(需要消耗更多的电量以及天气允许)”   
  8.                 android:title=“使用GPS”>  
  9.     </CheckBoxPreference>  
  10. </PreferenceCategory>  

       

以上代码当然也可以用Android提供的IDE工具直接生成。视频结构如下:

《Android的SharedPreferences和PreferenceActivity用法》

PreferenceCategory属性分析:
         title:显示的标题
         key:唯一标识(至少在同一程序中是唯一),SharedPreferences也将通过此Key值进行数据保存,也可以通过key值获取保存的信息 (以下相同)。
CheckBoxPreference属性分析:
        Key:唯一标识.
        title:显示标题(大字体显示)
       summary:副标题(小字体显示)
       defaultValue:默认值(当然,此处只能是true或false了)
Preference.xml的第二部分为“无线和网络设置”,此部分包括的内容比较多,也稍微复杂,一步一步来分析。
xml代码:

[html] view plaincopy

  1. <PreferenceCategory android:title=“无线和网络设置”>  
  2.     <CheckBoxPreference android:key=“apply_fly”  
  3.         android:summary=“禁用所有无线连接” android:title=“飞行模式”>  
  4.     </CheckBoxPreference>  
  5.     <CheckBoxPreference android:key=“apply_internet”  
  6.         android:summary=“禁用通过USB共享Internet连接”  
  7.                 android:title=“Internet共享”>  
  8.     </CheckBoxPreference>  
  9.     <CheckBoxPreference android:key=“apply_wifi”  
  10.         android:summary=“打开Wi-Fi” android:title=“Wi-Fi”>  
  11.     </CheckBoxPreference>  
  12.     <Preference android:summary=“设置和管理无线接入点” android:title=“Wi-Fi设置”  
  13.         android:dependency=“apply_wifi” android:key=“wifi_setting”>  
  14.     </Preference>  
  15.     <CheckBoxPreference android:key=“apply_bluetooth”  
  16.         android:summary=“启用蓝牙” android:title=“蓝牙”>  
  17.     </CheckBoxPreference>  
  18.     <Preference android:summary=“管理连接、设备设备名称和可检测性”  
  19.         android:title=“蓝牙设置” android:dependency=“apply_bluetooth”  
  20.         android:key=“bluetooth_setting”>  
  21.     </Preference>  
  22.     <EditTextPreference android:key=“number_edit”  
  23.         android:title=“输入电话号码”>  
  24.     </EditTextPreference>  
  25.     <ListPreference android:title=“部门设置” android:entries=“@array/department”  
  26.             android:entryValues=“@array/department_value”   
  27.                         android:dialogTitle=“选择部门”  
  28.             android:key=“depart_value”>  
  29.     </ListPreference>  
  30.     <RingtonePreference android:ringtoneType=“all” android:title=“玲聲”   
  31.                             android:showDefault=“true” android:key=“ring_key”  
  32.                             android:showSilent=“true”>  
  33.     </RingtonePreference>  
  34. </PreferenceCategory>  


对应的Structure图:

《Android的SharedPreferences和PreferenceActivity用法》

        第二部分中前三个都为CheckBoxPreference,不心多说,从<Preference android:key=”bluetooth_setting”/>开始。
Preference属性分析:
       Key:唯一标识.
        title:显示标题(大字体显示)
       summary:副标题(小字体显示)
     dependency:附属(嘛意思),即标识此元素附属于某一个元素(通常为CheckBoxPreference),dependency值为所附属元素的key。上面代码中的Preference元素附属于key等于“apply_bluetooth”的CheckPreference元素,当CheckPreference值为true时,Preference则为可用,否则为不可用。
EditTextPreperence属性分析:
    Key:唯一标识.
     title:显示标题(大字体显示)
ListPreference属性分析:
   Key:唯一标识.
   title:显示标题(大字体显示)
  dialogTitle:弹出对话框的标题
 entries:列表中显示的值。为一个数组,通读通过资源文件进行设置。
entryValues:列表中实际保存的值,也entries对应。为一个数组,通读通过资源文件进行设置。以下代码显示的是arrays.xml文件中内容:

[html] view plaincopy

  1. <resources>  
  2.     <string-array name=“department”>  
  3.         <item>综合部</item>  
  4.         <item>行政部</item>  
  5.         <item>外贸部</item>  
  6.     </string-array>  
  7.     <string-array name=“department_value”>  
  8.         <item>001</item>  
  9.         <item>002</item>  
  10.         <item>003</item>  
  11.     </string-array>  
  12. </resources>  

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

《Android的SharedPreferences和PreferenceActivity用法》

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

《Android的SharedPreferences和PreferenceActivity用法》

        最后把java文件中的addPreferencesFromResource(R.xml.preferences);改为addPreferencesFromResource(R.xml.preferencesii);
保存运行,看下效果。

《Android的SharedPreferences和PreferenceActivity用法》

RingtonePreference :玲声(暂时没有用到过),暂时略过。
        OK,Preference.xml内容已经分析完毕,属性都大致相同,相信亲自动力一试也就那么回事。那么如何把Preference.xml中内容展现出来呢?
Layout是通过继续自Activity的类来进行显示的,前面提到过,PreferenceActivity是专门用于显示preference的,所以只要创建一个继承自PreferenceActivity类即可。代码如下:

[java] view plaincopy

  1. public class Setting extends PreferenceActivity {  
  2.     @Override  
  3.     public void onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.         // 所的的值将会自动保存到SharePreferences  
  6.         addPreferencesFromResource(R.xml.preference);  
  7.     }  
  8. }  

        接下来就是运行程序,显示劳动成果。至此,工作已经完成大半,所有的值都会保存到SharedPreferences中,我们也可以读取到保存的结果。

2.4 如何获取ListPreference中选中的值

研究了一天,貌似ListPreference中根本就没有什么回调函数可以用
于是,向上一层,把注意力集中于SharedPreferences,
发现有这么个接口:onSharedPreferenceChanged
抱着试试看的态度,实现了该接口,发现此方法可行,先将部分代码分享如下:

[java] view plaincopy

  1. package yinger.firewall;  
  2.   
  3. import android.content.SharedPreferences;  
  4. import android.content.SharedPreferences.OnSharedPreferenceChangeListener;  
  5. import android.os.Bundle;  
  6. import android.preference.CheckBoxPreference;  
  7. import android.preference.ListPreference;  
  8. import android.preference.Preference;  
  9. import android.preference.PreferenceActivity;  
  10. import android.preference.PreferenceManager;  
  11. import android.preference.PreferenceScreen;  
  12.   
  13. public class CallFireWall extends PreferenceActivity implements  
  14.         OnSharedPreferenceChangeListener {  
  15.     ListPreference lp = null;  
  16.     String whiteMode = “1”;  
  17.     String blackMode = “2”;  
  18.   
  19.     /** Called when the activity is first created. */  
  20.     @Override  
  21.     public void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         addPreferencesFromResource(R.xml.preferences);  
  24.         this.setTitle(“Ying_er” + ”  Call Safe”);  
  25.         SharedPreferences prefs = PreferenceManager  
  26.                 .getDefaultSharedPreferences(this);  
  27.         prefs.registerOnSharedPreferenceChangeListener(this);  
  28.         lp = (ListPreference) findPreference(getString(R.string.pref_mode_key));  
  29.     }  
  30.   
  31.     @Override  
  32.     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,  
  33.             Preference preference) {  
  34.         // TODO Auto-generated method stub  
  35.         return super.onPreferenceTreeClick(preferenceScreen, preference);  
  36.     }  
  37.       
  38.     @Override  
  39.     public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,  
  40.             String key) {  
  41.         // TODO Auto-generated method stub  
  42.         System.out.println(“onSharedPreferenceChanged”);  
  43.         if (key == getString(R.string.pref_mode_key)){  
  44.             System.out.println(lp.getValue());  
  45.             if(lp.getValue().equals(whiteMode)){  
  46.                   
  47.             }  
  48.         }  
  49.     }  
  50. }  


注意:该事件需要注册。既:

[java] view plaincopy

  1. prefs.registerOnSharedPreferenceChangeListener(this);  

实际上,使用如下方法也是可以得到值的:

[java] view plaincopy

  1. PreferenceManager.getDefaultSharedPreferences(context).getBoolean(R.string.pref_mode_key, DEFAULT);  

2.5 OnPreferenceChangeListener

        以上我们分别介绍了Preference对数据的保存及PreferenceActivity设置界面。当PreferenceActivity中的内容改变时,Android系统会自动进行保存和持久化维护,我们只需要在要用的设置界面中数据的地方进行读取就可以了。同时Android还提供了OnPreferenceClickListener和OnPreferenceChangeListener两个与Preference相关的监听接口,当PreferenceActivity中的某一个Preference进行了点击或者改变的操作时,都会回调接口中的函数,这样可以第一个时间向其他Activity等通知系统设置进行了改变。
        下面我们以一个具体的Demo说明PreferenceActivity和其监听接口的使用。
        新建一个工程AndroidPreferenceDemoII,并按上面的步骤添加xml文件夹和其内容Preferenceii.xml,还有values文件夹中的array.xml和strings.xml。
        新建一个名为Settings的class,内容为:

[java] view plaincopy

  1. //继承PreferenceActivity,并实现OnPreferenceChangeListener和OnPreferenceClickListener监听接口    
  2. public class Settings extends PreferenceActivity implements OnPreferenceChangeListener,     
  3. OnPreferenceClickListener{    
  4.     //定义相关变量    
  5.     String updateSwitchKey;    
  6.     String updateFrequencyKey;    
  7.     CheckBoxPreference updateSwitchCheckPref;    
  8.     ListPreference updateFrequencyListPref;    
  9.     @Override    
  10.     public void onCreate(Bundle savedInstanceState) {    
  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.     public boolean onPreferenceChange(Preference preference, Object newValue) {    
  27.         // TODO Auto-generated method stub    
  28.         Log.v(“SystemSetting”“preference is changed”);    
  29.         Log.v(“Key_SystemSetting”, preference.getKey());    
  30.         //判断是哪个Preference改变了    
  31.         if(preference.getKey().equals(updateSwitchKey))    
  32.         {    
  33.             Log.v(“SystemSetting”“checkbox preference is changed”);    
  34.         }    
  35.         else if(preference.getKey().equals(updateFrequencyKey))    
  36.         {    
  37.             Log.v(“SystemSetting”“list preference is changed”);    
  38.         }    
  39.         else    
  40.         {    
  41.             //如果返回false表示不允许被改变    
  42.             return false;    
  43.         }    
  44.         //返回true表示允许改变    
  45.         return true;    
  46.     }    
  47.     @Override    
  48.     public boolean onPreferenceClick(Preference preference) {    
  49.         // TODO Auto-generated method stub    
  50.         Log.v(“SystemSetting”“preference is clicked”);    
  51.         Log.v(“Key_SystemSetting”, preference.getKey());    
  52.         //判断是哪个Preference被点击了    
  53.         if(preference.getKey().equals(updateSwitchKey))    
  54.         {    
  55.             Log.v(“SystemSetting”“checkbox preference is clicked”);    
  56.         }    
  57.         else if(preference.getKey().equals(updateFrequencyKey))    
  58.         {    
  59.             Log.v(“SystemSetting”“list preference is clicked”);    
  60.         }    
  61.         else    
  62.         {    
  63.             return false;    
  64.         }    
  65.         return true;    
  66.     }   

[java] view plaincop

    当然重写PreferenceActivity的 onPreferenceTreeClick的方法就可以了,通过参数preference来判断是对那一个元素进行的,并根据需要进行操作。

[java] view plaincopy

  1. @Override  
  2. public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,  
  3.         Preference preference) {  
  4.     return false;  
  5. }  

2.5 OnPreferenceChangeListener与OnPreferenceClickListener的区别

两种监听器OnPreferenceChangeListener和OnPreferenceClickListener,OnPreferenceClickListener的意思好理解,但是OnPreferenceChangeListener就不好懂了,所以就写了个Demo分析了一下,代码如下:

[java] view plaincopy

  1. <p></p><pre name=“code” class=“java”>package com.luther.test;  
  2.    
  3.  import com.luther.test.R;  
  4.    
  5.  import android.content.SharedPreferences;  
  6.  import android.os.Bundle;  
  7.  import android.preference.CheckBoxPreference;  
  8.  import android.preference.EditTextPreference;  
  9.  import android.preference.ListPreference;  
  10.  import android.preference.Preference;  
  11.  import android.preference.Preference.OnPreferenceChangeListener;  
  12.  import android.preference.Preference.OnPreferenceClickListener;  
  13.  import android.preference.PreferenceActivity;  
  14.  import android.preference.PreferenceManager;  
  15.  import android.preference.PreferenceScreen;  
  16.  import android.widget.Toast;  
  17.    
  18.  public class PreferenceDemoActivity extends PreferenceActivity   
  19.          implements OnPreferenceChangeListener, OnPreferenceClickListener{  
  20.    
  21.      private ListPreference mList1Prefs;  
  22.      private ListPreference mList2Prefs;  
  23.      private CheckBoxPreference mCheckPrefs;  
  24.      private EditTextPreference mEditPrefs;  
  25.      private SharedPreferences mSharedPrefs;  
  26.        
  27.      /** Called when the activity is first created. */  
  28.      @Override  
  29.      public void onCreate(Bundle savedInstanceState) {  
  30.          super.onCreate(savedInstanceState);  
  31.          addPreferencesFromResource(R.xml.preference);  
  32.          initViews();  
  33.      }  
  34.        
  35.      private void initViews(){  
  36.          //得到以包命名的SharedPreferences  
  37.          mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);  
  38.            
  39.          mList1Prefs = (ListPreference) findPreference(“key_call_config”);  
  40.          mList2Prefs = (ListPreference) findPreference(“key_msg_config”);  
  41.          mCheckPrefs = (CheckBoxPreference) findPreference(“switch”);  
  42.          mEditPrefs = (EditTextPreference) findPreference(“autoreply_text_cpntent”);  
  43.            
  44.          mList1Prefs.setOnPreferenceClickListener(this);  
  45.          mList1Prefs.setOnPreferenceChangeListener(this);  
  46.          mList2Prefs.setOnPreferenceChangeListener(this);  
  47.          mList2Prefs.setOnPreferenceClickListener(this);  
  48.      }  
  49.    
  50.      @Override  
  51.      public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,  
  52.              Preference preference) {  
  53.          if(preference == mEditPrefs){  
  54.              String toastStr = mEditPrefs.getTitle() + “\n”  
  55.                              + “Content: “ + mEditPrefs.getText();  
  56.              showToast(toastStr);  
  57.          }  
  58.          return super.onPreferenceTreeClick(preferenceScreen, preference);  
  59.      }  
  60.    
  61.      public boolean onPreferenceClick(Preference preference) {  
  62.          String prefsValue = mSharedPrefs.getString(preference.getKey(), “-1”);  
  63.          showToast(prefsValue);  
  64.          return false;  
  65.      }  
  66.    
  67.      public boolean onPreferenceChange(Preference preference, Object newValue) {  
  68.            
  69.          if(mList1Prefs == preference){  
  70.              String prefsValue = mSharedPrefs.getString(preference.getKey(), “-1”);  
  71.              showToast(prefsValue);  
  72.          }  
  73.          if(mList2Prefs == preference){  
  74.              String prefsValue = newValue.toString();  
  75.              showToast(prefsValue);  
  76.              mList2Prefs.setValue(prefsValue);  
  77.          }  
  78.          return false;  
  79.      }  
  80.        
  81.      private void showToast(String arg){  
  82.          Toast.makeText(this, arg, Toast.LENGTH_SHORT).show();  
  83.      }   
  84.        
  85.  }  

     

  程序原理:用一个ListPreference分别注册这两个监听器,然后用Tosat看他们在什么时候响应。../res/xml/preference文件如下:

[java] view plaincopy

  1. <?xml version=“1.0” encoding=“utf-8”?>  
  2.  <PreferenceScreen xmlns:android=“http://schemas.android.com/apk/res/android”   
  3.      android:title=“@string/settings”>  
  4.      <PreferenceCategory   
  5.      android:title=“@string/general_settings”>  
  6.          <ListPreference  
  7.         android:key=“key_call_config”  
  8.              android:title=“@string/incoming_call_come”  
  9.              android:dialogTitle=“@string/incoming_call_come”   
  10.              android:entries=“@array/response_entries”  
  11.              android:entryValues=“@array/response_entry_values”/>  
  12.          <ListPreference   
  13.         android:key=“key_msg_config”  
  14.              android:title=“@string/message_come”  
  15.              android:dialogTitle=“@string/message_come”   
  16.              android:entries=“@array/response_entries”  
  17.              android:entryValues=“@array/response_entry_values”/>  
  18.      </PreferenceCategory>  
  19.        
  20.      <PreferenceCategory   
  21.       android:title=“@string/user_defined_autoreply_settings”>  
  22.          <CheckBoxPreference   
  23.         android:title=“@string/autoreply_switch”  
  24.              android:key=“switch”/>  
  25.          <EditTextPreference  
  26.         android:title=“@string/user_defined_autoreply_text”  
  27.              android:key=“autoreply_text_cpntent”  
  28.              android:dependency=“switch”  
  29.              android:dialogTitle=“@string/user_defined_autoreply_text”  
  30.              android:positiveButtonText=“@android:string/ok”  
  31.              android:negativeButtonText=“@android:string/cancel”/>  
  32.      </PreferenceCategory>  
  33.    
  34.  </PreferenceScreen>  


以下是ListPreference的Entries和EntryValues:

[html] view plaincopy

  1. <?xml version=“1.0” encoding=“utf-8”?>  
  2.  <resources>  
  3.      <string-array name=“response_entries”>  
  4.          <item>静音</item>  
  5.          <item>振动</item>  
  6.          <item>正常响铃</item>  
  7.          <item>LED灯亮</item>  
  8.      </string-array>  
  9.      <string-array name=“response_entry_values”>  
  10.          <item>0</item>  
  11.          <item>1</item>  
  12.          <item>2</item>  
  13.          <item>3</item>  
  14.      </string-array>  
  15.        
  16.  </resources>  


string.xml文件:

[html] view plaincopy

  1. <?xml version=“1.0” encoding=“utf-8”?>  
  2.  <resources>  
  3.      <string name=“hello”>Hello World, PreferenceDemoActivity!</string>  
  4.      <string name=“app_name”>PreferenceDemo</string>  
  5.      <string name=“settings”>设置</string>  
  6.        
  7.      <string name=“general_settings”>常规设置</string>  
  8.      <string name=“incoming_call_come”>来电时</string>  
  9.      <string name=“message_come”>来短信时</string>  
  10.    
  11.        
  12.      <string name=“user_defined_autoreply_settings”>自定义回复设置</string>  
  13.      <string name=“autoreply_switch”>自动回复</string>  
  14.      <string name=“user_defined_autoreply_text”>自动回复短信</string>  
  15.  </resources>  


下面是Demo的主界面:

《Android的SharedPreferences和PreferenceActivity用法》

        编译好,运行程序:点击mList1Prefs(来电时),Toast显示“-1”。再点击一个选项,对话框消失,Toast显示“-1”,为什么会这样?为什么不是第一次选中时的选项值?
        其实,这是因为设置了OnPreferenceChangeListener。默认情况下,普通的ListPreference第一次选中一个值之后,Android框架会存贮好选中的值,下次打开,会默认选中上次选中的值,但是设置OnPreferenceChangeListener之后,值的存储就要自己来了,详见代码中的mList2Prefs.setValue();“来短信时”这一项就能够正常存贮选中的值。
        现在区别就出来了:
OnPreferenceClickListener:是响应点击preference的事件,比如程序中,一点ListPreference,onPreferenceClick()中就弹出Toast。
OnPreferenceChangeListener:是响应preference的值被改变的事件(此时被改变的值需要自己存贮到SharedPreferences) ,比如程序中,点击ListPreference的某一项,onPreferenceChange()中就会弹出Toast。
        另外:onPreferenceTreeClick()这个方法感觉和OnPreferenceClickListener的回调方法onPreferenceClick()的作用差不多,一样是响应点击的事件。
        回头再看OnPreferenceChangeListener的文档:
Interface definition for a callback to be invoked when the value of this Preference has been changed by the user and is about to be set and/or persisted. This gives the client a chance to prevent setting and/or persisting the value.

就非常明白了~

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

PreferenceActivity

  PreferenceActivity是android提供的对系统信息和配置进行自动保存的Activity,它通过SharedPreference方式将信息保存在XML 文件当中。使用PreferenceActivity不需要我们对SharedPreference进行操作,系统会自动对Activity 的各种View上的改变进行保存(这个真是太赞了!)。
  在android项目中添加一个 android xml 文件需要注意的是这次选择的是 Preference。而不是以往的Layout
《Android的SharedPreferences和PreferenceActivity用法》
这个文件是保存在 res /xml 路径下的。

PreferenceScreen xml

  preference下的View是有限的,只有下面几个:

  • CheckBoxPreference:CheckBox选择项,对应的值的ture或flase
  • EditTextPreference:输入编辑框,值为String类型,会弹出对话框供输入。
  • ListPreference: 列表选择,弹出对话框供选择。
  • Preference:只进行文本显示,需要与其他进行组合使用。
  • PreferenceCategory:用于分组。
  • RingtonePreference:系统玲声选择

更多关于 PreferenceScreen的介绍可以查看博客园上的一篇文章:Android之PreferenceActivity
[html] view plaincopy

  1. <pre name=“code” class=“html”><pre name=“code” class=“html”><?xml version=“1.0” encoding=“utf-8”?>  
  2. <PreferenceScreen xmlns:android=“http://schemas.android.com/apk/res/android”>  
  3. <CheckBoxPreference android:key=“sounds”  
  4. android:title=“@string/play_sounds” android:summary=“@string/play_sounds_summary”  
  5. android:defaultValue=“true”></CheckBoxPreference>  
  6. <EditTextPreference android:key=“warning_time”  
  7. android:title=“@string/warning_time” android:summary=“@string/warning_time_summary”  
  8. android:defaultValue=“15” android:inputType=“phone” android:digits=“0123456789”></EditTextPreference>  
  9. <CheckBoxPreference android:key=“unlimited_participants”  
  10. android:title=“@string/unlimited_participants” android:summary=“@string/unlimited_participants_summary”  
  11. android:defaultValue=“false”></CheckBoxPreference>  
  12. <CheckBoxPreference android:key=“variable_meeting_length”  
  13. android:title=“@string/variable_meeting_length” android:summary=“@string/variable_meeting_length_summary”  
  14. android:defaultValue=“false”></CheckBoxPreference>  
  15. </PreferenceScreen> 


android:key 唯一标识符。它对应保存的XML保存的配置文件中的节点的 name属性
android:defaultValue 默认值,对应XML中的Value属性的值。
[java] view plaincopy

  1. /** 
  2.      * PreferenceActivity 会自动保存更改 
  3.      */  
  4.     @Override  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         this.addPreferencesFromResource(R.xml.setting);  
  8.     }  

当PreferenceActivity上的View有所更改时,系统会自动将对应的值更新到XML配置文件中,该文件可以在android 的 file explorer 中的 data/data/"yourPageName"/shared_prefs/"yourpageName"_prefenrences.xml中找到。“yourpageName”表示你项目所在的包。

获取配置信息

  为了方便的获取配置信息,我们可以在PreferenceActivity里添加一些pulbic 方法来公开配置信息的访问。


[java] view plaincopy

  1. /** 
  2. * 获取是否播放声音 
  3. */  
  4. public static boolean playSounds(Context context) {  
  5. return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(SOUNDS, SOUNDS_DEFAULT);  
  6. }  
  7.   
  8. /** 
  9. * 设置播放的声音 
  10. * @param context 上下文 
  11. * @param value 是否播放 
  12. */  
  13. public static void setPlaySounds(Context context, boolean value) {  
  14. PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(SOUNDS, value).commit();  
  15. }  
  16.   
  17. /** 
  18. * 获取警告时间 
  19. * @param context 上下文 
  20. * @return 警告时间秒 
  21. */  
  22. public static int getWarningTime(Context context) {  
  23. String value=PreferenceManager.getDefaultSharedPreferences(context).getString(WARNING_TIME,Integer.toString(WARNING_TIME_DEFAULT));  
  24. try  
  25. {  
  26. return Integer.parseInt(value);  
  27. }  
  28. catch(NumberFormatException e)  
  29. {  
  30. setWarningTime(context, WARNING_TIME_DEFAULT);  
  31. return WARNING_TIME_DEFAULT;  
  32. }  
  33. }  
  34. /** 
  35. * 设置警告时间 
  36. * @param context 上下文 
  37. * @param warningTime 警告时间 
  38. */  
  39. public static void setWarningTime(Context context, int warningTime) {  
  40. PreferenceManager.getDefaultSharedPreferences(context).edit().putString(WARNING_TIME, Integer.toString(warningTime)).commit();  
  41.   
  42. }  
  43. /** 
  44. * 参加人数无限制 
  45. * @param context 
  46. * @return 
  47. */  
  48. public static boolean allowUnlimitedParticipants(Context context) {  
  49. return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(UNLIMITED_PARTICIPANTS, UNLIMITED_PARTICIPANTS_DEFAULT);  
  50. }  
  51.   
  52. public static void setAllowUnlimitedParticipants(Context context, boolean value) {  
  53. PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(UNLIMITED_PARTICIPANTS, value).commit();  
  54. }  
  55. /** 
  56. * 允许编辑会议时间 
  57. * @param context 
  58. * @return 
  59. */  
  60. public static boolean allowVariableMeetingLength(Context context) {  
  61. return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(VARIABLE_MEETING_LENGTH, VARIABLE_MEETING_LENGTH_DEFAULT);  
  62. }  
  63. public static void setAllowVariableMeetingLength(Context context, boolean value) {  
  64. PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(VARIABLE_MEETING_LENGTH, value).commit();  

  getDefaultSharedPreferences(Context )用来获取preferences.以后的操作就和普通的Sharedpreferences一样了,如果需要修改某项配置的信息,记得最后需要 commit()。

当其他地方需要使用配置时,可以直接调用 setting.getXXX() 方法来获取配置信息。

系列索引

  
Android 开源项目-StandupTimer学习笔记索引

    原文作者:YAnG_Linux
    原文地址: https://blog.csdn.net/YUZHIBOYI/article/details/7676293
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞