现在的位置: 首页 > 综合 > 正文

OnPreferenceChangeListener分析,以及与OnPreferenceClickListener的区别

2013年10月10日 ⁄ 综合 ⁄ 共 5918字 ⁄ 字号 评论关闭

 http://www.cnblogs.com/LutherTsai/archive/2011/12/25/2301014.html

  最近学习Android中PreferenceScreen的时候,遇到两种监听器OnPreferenceChangeListener和OnPreferenceClickListener,OnPreferenceClickListener的意思好理解,但是OnPreferenceChangeListener就不好懂了,所以就写了个Demo分析了一下,代码如下:

 1 package com.luther.test;
 3 import com.luther.test.R;
 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;
18 public class PreferenceDemoActivity extends PreferenceActivity 
19         implements OnPreferenceChangeListener, OnPreferenceClickListener{
21     private ListPreference mList1Prefs;
22     private ListPreference mList2Prefs;
23     private CheckBoxPreference mCheckPrefs;
24     private EditTextPreference mEditPrefs;
25     private SharedPreferences mSharedPrefs;
27     /** Called when the activity is first created. */
29     public void onCreate(Bundle savedInstanceState) {
30         super.onCreate(savedInstanceState);
31         addPreferencesFromResource(R.xml.preference);
32         initViews();
33     }
35     private void initViews(){
36         //得到以包命名的SharedPreferences
37         mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
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");
44         mList1Prefs.setOnPreferenceClickListener(this);
45         mList1Prefs.setOnPreferenceChangeListener(this);
46         mList2Prefs.setOnPreferenceChangeListener(this);
47         mList2Prefs.setOnPreferenceClickListener(this);
48     }
49 	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     }
61     public boolean onPreferenceClick(Preference preference) {
62         String prefsValue = mSharedPrefs.getString(preference.getKey(), "-1");
63         showToast(prefsValue);
64         return false;
65     }
67     public boolean onPreferenceChange(Preference preference, Object newValue) {  (此为回调函数)
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     }
81     private void showToast(String arg){
82         Toast.makeText(this, arg, Toast.LENGTH_SHORT).show();
83     } 
84     
85 }
程序原理:用一个ListPreference分别注册这两个监听器,然后用Tosat看他们在什么时候响应。

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

 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"/>
33     </PreferenceCategory>
34 
35 </PreferenceScreen>
以下是ListPreference的Entries和EntryValues:
 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文件: 
 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的主界面:

编译好,运行程序:点击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.

就非常明白了~

抱歉!评论已关闭.