android中SharedPreferences和PreferenceActivity的存取数据

本文主要介绍SharedPreferences和PreferenceActivity的基础知识和用法。

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

Android之PreferenceActivity》--http://www.cnblogs.com/wservices/archive/2010/07/08/1773449.htmljava

在Android中Preferences数据存储的使用android

Android的设置界面及Preference使用数据库

OnPreferenceChangeListener分析,以及与OnPreferenceClickListener的区别数组

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

android数据存储与访问之使用SharedPreferencesapp

from:http://www.cnblogs.com/wservices/archive/2010/07/08/1773449.html框架

http://blog.sina.com.cn/s/blog_82f2fc2801013ho6.htmlide

参考:函数

http://blog.sina.com.cn/s/blog_5da93c8f0100zfmx.html

设计本身的Android Preference

http://blog.163.com/guozioo@126/blog/static/6408694720106711453584/

http://griffinshi.iteye.com/blog/694464

http://zhoujiyu.blog.51cto.com/675686/467832

精仿QQ设置界面(自定义PreferenceActivity)

http://www.eoeandroid.com/thread-116148-1-1.html

自定义带有图片的PreferenceActivity

http://my.oschina.net/huangsm/blog/40027

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

http://www.blogjava.net/crazycoding/archive/2011/04/05/347641.html

一、android文件存储

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

二、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后就能够对数据进行读取或者保存了。
        保存方式以下:

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,而后就能够经过putInt、putString等方法以键值对(key-value)的方式保存数据,或者remove移除某个键(key),及调用clear方法删除全部内容。最后须要调用commit方法是使修改生效。
        读取方式以下:

SharedPreferences settings = getSharedPreferences(STORE_NAME, MODE_PRIVATE);   

int source = settings.getInt("sorceType",1);   

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

二、PreferencesActivity

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

2.1 建立PreferencesActivity

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

  或者是:

 

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

 

  或者是:

2.2 PrefeneceActivity的基本组成

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

 

 

 

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

 

 

 

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

 

 

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

 

 

 

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

 

 

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

 

 

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

 

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

2.3 PreferenceActivity实例

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

    <PreferenceCategory
        android:key="set_local"
        android:title="个人位置" >
        <CheckBoxPreference
            android:defaultValue="true"
            android:key="apply_wifi"
            android:summary="使用无线网络在应用程序(例如Google地图)中查看位置"
            android:title="使用无线网络" >
        </CheckBoxPreference>
        <CheckBoxPreference
            android:key="apply_gps"
            android:summary="定位到街道级别(须要消耗更多的电量以及天气容许)"
            android:title="使用GPS" >
        </CheckBoxPreference>
    </PreferenceCategory>

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

 

 

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

 <PreferenceCategory android:title="无线和网络设置" >
        <CheckBoxPreference
            android:key="apply_fly"
            android:summary="禁用全部无线链接"
            android:title="飞行模式" >
        </CheckBoxPreference>
        <CheckBoxPreference
            android:key="apply_internet"
            android:summary="禁用经过USB共享Internet链接"
            android:title="Internet共享" >
        </CheckBoxPreference>
        <CheckBoxPreference
            android:key="apply_wifi"
            android:summary="打开Wi-Fi"
            android:title="Wi-Fi" >
        </CheckBoxPreference>

        <Preference
            android:dependency="apply_wifi"
            android:key="wifi_setting"
            android:summary="设置和管理无线接入点"
            android:title="Wi-Fi设置" >
        </Preference>

        <CheckBoxPreference
            android:key="apply_bluetooth"
            android:summary="启用蓝牙"
            android:title="蓝牙" >
        </CheckBoxPreference>

        <Preference
            android:dependency="apply_bluetooth"
            android:key="bluetooth_setting"
            android:summary="管理链接、设备设备名称和可检测性"
            android:title="蓝牙设置" >
        </Preference>

        <EditTextPreference
            android:key="number_edit"
            android:title="输入电话号码" >
        </EditTextPreference>

        <ListPreference
            android:dialogTitle="选择部门"
            android:entries="@array/department"
            android:entryValues="@array/department_value"
            android:key="depart_value"
            android:title="部门设置" >
        </ListPreference>

        <RingtonePreference
            android:key="ring_key"
            android:ringtoneType="all"
            android:showDefault="true"
            android:showSilent="true"
            android:title="铃声" >
        </RingtonePreference>
    </PreferenceCategory>

 

对应的Structure图:

 

 

第二部分中前三个都为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文件中内容:

<resources>
 <string-array name="department">
  <item>综合部</item>
  <item>行政部</item>
  <item>外贸部</item>
 </string-array>
 <string-array name="department_value">
  <item>001</item>
  <item>002</item>
  <item>003</item>
 </string-array>

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

 

 

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

 

ps:在ListPreference的属性android:dependency“”写入CheckBoxPreferencekey时候,有时候直接引用@string或许无效,会报ClassCastException

这时候,也能够在dependency属性中直接写入CheckBoxPreferencekey

 

 

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

 

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

public class PerfernceActivity extends PreferenceActivity {
 /** Called when the activity is first created. */
@Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
   addPreferencesFromResource(R.xml.perference);

}

接下来就是运行程序,显示劳动成果。至此,工做已经完成大半,全部的值都会保存到SharedPreferences中,咱们也能够读取到保存的结果。

2.4 如何获取ListPreference中选中的值

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

import android.content.SharedPreferences; 

import android.content.SharedPreferences.OnSharedPreferenceChangeListener; 

import android.os.Bundle; 

import android.preference.CheckBoxPreference; 

import android.preference.ListPreference; 

import android.preference.Preference; 

import android.preference.PreferenceActivity; 

import android.preference.PreferenceManager; 

import android.preference.PreferenceScreen; 

 

public class CallFireWallextends PreferenceActivityimplements 

        OnSharedPreferenceChangeListener { 

    /** Called when the activity is first created. */ 

    @Override 

    public void onCreate(Bundle savedInstanceState) { 

        super.onCreate(savedInstanceState); 

        addPreferencesFromResource(R.xml.perferencesii); 

        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
        String value = sp.getString("ListPreference"(ListPreference的key), "");
          if(value == null){
            return;
            }else{
             System.out.println(value);
             }

    } 

 ps:经过ListPreference的key,能够直接获取点击ListPreference的item

实际上,使用以下方法也是能够获得值的:

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

对于利用SharedPreferences获取不一样类型的key,所调用的get数据类型方法,这个就不须要我多讲了吧

 

我的追加小结:

public class PreferActivity extends PreferenceActivity implements
  OnSharedPreferenceChangeListener {
 /** Called when the activity is first created. */
 private SharedPreferences sp;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  addPreferencesFromResource(R.xml.perference);
  sp = PreferenceManager.getDefaultSharedPreferences(this);
  sp.registerOnSharedPreferenceChangeListener(this);

 }

 @Override
 public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
   String key) {
  // TODO Auto-generated method stub
  System.out.println("onSharedPreferenceChanged");
  if (key.equals("number_edit")) {
   String number = sharedPreferences.getString("number_edit", "");
   if (number != null) {
    System.out.println("number ** " + number);
   } else {
    System.out.println("numbser is null **" + number);
   }
  }
  if (key.equals("apply_gps")) {
   Boolean either = sharedPreferences.getBoolean("apply_gps", false);
   System.out.println(either);
   if (!either) {
    Log.d("either", "either == true");

   } else {
    Log.d("either", "either == false");
   }

//activity之间的简单跳转
  if(key.equals("apply_fly")){
   Intent intent = new Intent ();
   intent.setClass(PreferActivity.this, renren.class);
   startActivity(intent);
  }  }

 }

 @Override
 public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
   Preference preference) {
  // TODO Auto-generated method stub
  return super.onPreferenceTreeClick(preferenceScreen, preference);
 }
}

以上代码为:分别从preference中根据key获取不一样类型的数据

2.5 分析Preference事件

   ★ 在PreferenceActivity方法中,一个比较重要的监听点击事件方法为:
         public booleanonPreferenceTreeClick (PreferenceScreen preferenceScreen, Preference preference)
                           说 明 : 当Preference控件被点击时,触发该方法。
           参数说明: preference   点击的对象。
           返回值:   true  表明点击事件已成功捕捉,无须执行默认动做或者返回上层调用链。 例如,不跳转至默认Intent。
                      false 表明执行默认动做而且返回上层调用链。例如,跳转至默认Intent。
      在咱们继承PreferenceActivity的Activity能够重写该方法,来完成咱们对Preference事件的捕捉。
     相信经过前面的介绍,你必定知道了如何使用了Preference家族而且对其触发方法。下面咱们抛出另外两枚炸弹——Preference相关的两个重要监听接口。
   ★  Preference.OnPreferenceChangeListener     该监听器的一个重要方法以下:
        boolean onPreferenceChange(Preference preference,Object objValue)
             说明:  当Preference的元素值发送改变时,触发该事件。
             返回值:true  表明将新值写入sharedPreference文件中。
                     false 则不将新值写入sharedPreference文件
  ★   Preference.OnPreferenceClickListener      该监听器的一个重要方法以下:
         public booleanonPreferenceClick(Preference preference)
             说明:当点击控件时触发发生,能够作相应操做。                      
    那么当一个Preference控件实现这两个接口时,当被点击或者值发生改变时,触发方法是如何执行的呢?事实上,它的触发规则以下:
      1 先调用onPreferenceClick()方法,若是该方法返回true,则再也不调用onPreferenceTreeClick方法 ;
       若是onPreferenceClick方法返回false,则继续调用onPreferenceTreeClick方法。
      2 onPreferenceChange的方法独立与其余两种方法的运行。也就是说,它老是会运行。

2.6 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,内容为:

//继承PreferenceActivity,并实现OnPreferenceChangeListener和OnPreferenceClickListener监听接口  

public class Settingsextends PreferenceActivityimplements 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

        {   

            returnfalse;   

        }   

        return true;   

    }  

固然重写PreferenceActivity的 onPreferenceTreeClick的方法就能够了,经过参数preference来判断是对那一个元素进行的,并根据须要进行操做。

@Override

public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, 

        Preference preference) { 

    return false

2.7 OnPreferenceChangeListener与OnPreferenceClickListener的区别

两种监听器OnPreferenceChangeListener和OnPreferenceClickListener,OnPreferenceClickListener的意思好理解,可是OnPreferenceChangeListener就很差懂了,因此就写了个Demo分析了一下,代码以下:

<p></p><pre class="java" name="code">package com.luther.test; 

  

import com.luther.test.R; 

  

import android.content.SharedPreferences; 

import android.os.Bundle; 

import android.preference.CheckBoxPreference; 

import android.preference.EditTextPreference; 

import android.preference.ListPreference; 

import android.preference.Preference; 

import android.preference.Preference.OnPreferenceChangeListener; 

import android.preference.Preference.OnPreferenceClickListener; 

import android.preference.PreferenceActivity;  

import android.preference.PreferenceManager; 

import android.preference.PreferenceScreen; 

import android.widget.Toast; 

  

public class PreferenceDemoActivityextends PreferenceActivity  

         implements OnPreferenceChangeListener, OnPreferenceClickListener{ 

  

     private ListPreference mList1Prefs; 

     private ListPreference mList2Prefs; 

     private CheckBoxPreference mCheckPrefs; 

     private EditTextPreference mEditPrefs; 

     private SharedPreferences mSharedPrefs; 

      

     /** Called when the activity is first created. */ 

     @Override 

     public void onCreate(Bundle savedInstanceState) { 

         super.onCreate(savedInstanceState); 

         addPreferencesFromResource(R.xml.preference); 

         initViews(); 

     } 

      

     private void initViews(){ 

         //获得以包命名的SharedPreferences

         mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); 

          

         mList1Prefs = (ListPreference) findPreference("key_call_config"); 

         mList2Prefs = (ListPreference) findPreference("key_msg_config"); 

         mCheckPrefs = (CheckBoxPreference) findPreference("switch"); 

         mEditPrefs = (EditTextPreference) findPreference("autoreply_text_cpntent"); 

          

         mList1Prefs.setOnPreferenceClickListener(this); 

         mList1Prefs.setOnPreferenceChangeListener(this); 

         mList2Prefs.setOnPreferenceChangeListener(this); 

         mList2Prefs.setOnPreferenceClickListener(this); 

     } 

  

     @Override 

     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, 

             Preference preference) { 

         if(preference == mEditPrefs){ 

             String toastStr = mEditPrefs.getTitle() + "\n" 

                             + "Content: " + mEditPrefs.getText(); 

             showToast(toastStr); 

         } 

         return super.onPreferenceTreeClick(preferenceScreen, preference); 

     } 

  

     public boolean onPreferenceClick(Preference preference) { 

         String prefsValue = mSharedPrefs.getString(preference.getKey(),"-1"); 

         showToast(prefsValue); 

         return false

     } 

  

     public boolean onPreferenceChange(Preference preference, Object newValue) { 

          

        if(mList1Prefs == preference){ 

             String prefsValue = mSharedPrefs.getString(preference.getKey(),"-1"); 

             showToast(prefsValue); 

         } 

         if(mList2Prefs == preference){ 

             String prefsValue = newValue.toString(); 

             showToast(prefsValue); 

             mList2Prefs.setValue(prefsValue); 

         } 

         return false

     } 

      

     private void showToast(String arg){ 

         Toast.makeText(this, arg, Toast.LENGTH_SHORT).show(); 

     }  

      

}</pre>        程序原理:用一个ListPreference分别注册这两个监听器,而后用Tosat看他们在何时响应。<br> 

.../res/xml/preference文件以下: 

<p></p> 

<p></p> 

<pre class="java" name="code"><?xml version="1.0" encoding="utf-8"?> 

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

     android:title="@string/settings"

     <PreferenceCategory  

    android:title="@string/general_settings"

         <ListPreference 

       android:key="key_call_config" 

             android:title="@string/incoming_call_come" 

             android:dialogTitle="@string/incoming_call_come"  

             android:entries="@array/response_entries" 

             android:entryValues="@array/response_entry_values"/> 

         <ListPreference  

      android:key="key_msg_config" 

             android:title="@string/message_come" 

             android:dialogTitle="@string/message_come"  

             android:entries="@array/response_entries" 

             android:entryValues="@array/response_entry_values"/> 

     </PreferenceCategory> 

      

     <PreferenceCategory  

    android:title="@string/user_defined_autoreply_settings"

         <CheckBoxPreference  

       android:title="@string/autoreply_switch" 

             android:key="switch"/> 

         <EditTextPreference 

       android:title="@string/user_defined_autoreply_text" 

             android:key="autoreply_text_cpntent" 

             android:dependency="switch" 

             android:dialogTitle="@string/user_defined_autoreply_text" 

             android:positiveButtonText="@android:string/ok" 

             android:negativeButtonText="@android:string/cancel"/> 

     </PreferenceCategory> 

  

</PreferenceScreen></pre>如下是ListPreference的Entries和EntryValues:<br> 

<pre class="html" name="code"><?xml version="1.0" encoding="utf-8"?> 

<resources> 

     <string-array name="response_entries"

         <item>静音</item> 

         <item>振动</item> 

         <item>正常响铃</item> 

         <item>LED灯亮</item> 

     </string-array> 

     <string-array name="response_entry_values"

         <item>0</item> 

         <item>1</item> 

         <item>2</item> 

         <item>3</item> 

     </string-array> 

      

</resources></pre>string.xml文件:<br> 

<p></p> 

<p></p> 

<pre class="html" name="code"><?xml version="1.0" encoding="utf-8"?> 

<resources> 

     <string name="hello">Hello World, PreferenceDemoActivity!</string> 

     <string name="app_name">PreferenceDemo</string> 

     <string name="settings">设置</string> 

      

     <string name="general_settings">常规设置</string> 

     <string name="incoming_call_come">来电时</string> 

     <string name="message_come">来短信时</string> 

  

      

     <string name="user_defined_autoreply_settings">自定义回复设置</string> 

     <string name="autoreply_switch">自动回复</string> 

     <string name="user_defined_autoreply_text">自动回复短信</string> 

</resources></pre>下面是Demo的主界面:<br> 

<p></p> 

<p><img alt="" src="http://hi.csdn.net/attachment/201203/7/0_13311289314loq.gif"><br> 

</p> 

<p>       <pre class="java" name="code"><p> 编译好,运行程序:点击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 ofthis 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. 

就很是明白了~ 

</p><p><strong>3、访问其余应用中的Preference</strong></p><p>若是访问其余应用中的Preference,前提条件是:该preference建立时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE权限。如:有个<package name>为cn.itcast.action的应用使用下面语句建立了preference。 

getSharedPreferences("itcast", Context.MODE_WORLD_READABLE); 

其余应用要访问上面应用的preference,首先须要建立上面应用的Context,而后经过Context 访问preference ,访问preference时会在应用所在包下的shared_prefs目录找到preference :</p></pre><p></p> 

<p></p> 

<pre class="java" name="code">Context otherAppsContext = createPackageContext("com.oce.action", Context.CONTEXT_IGNORE_SECURITY); 

SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("config", Context.MODE_WORLD_READABLE); 

String name = sharedPreferences.getString("name",""); 

int age = sharedPreferences.getInt("age",0);</pre><br> 

<pre class="java" name="code">若是不经过建立Context访问其余应用的preference,也能够以读取xml文件方式直接访问其余应用preference对应的xml文件,如:  

File xmlFile = new File(“/data/data/<package name>/shared_prefs/itcast.xml”);//<package name>应替换成应用的包名。</pre><pre class="java" name="code">可是这样直接读取文件,不出意外会碰到权限问题。</pre><pre class="java" name="code"></pre><p></p><pre></pre>

<pre></pre> 

<pre></pre> 

<pre></pre> 

<pre></pre> 

<pre></pre> 

 



相关文章
相关标签/搜索