OnPreferenceChangeListener和OnPreferenceClickListener分析
2012-05-24 18:17
225 查看
OnPreferenceChangeListener分析,以及与OnPreferenceClickListener的区别
OnPreferenceChangeListener分析,以及与OnPreferenceClickListener的区别
最近学习Android中PreferenceScreen的时候,遇到两种监听器OnPreferenceChangeListener和OnPreferenceClickListener,OnPreferenceClickListener的意思好理解,但是OnPreferenceChangeListener就不好懂了,所以就写了个Demo分析了一下,代码如下:1 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文件如下:
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
Preferencehas
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.
就非常明白了~
相关文章推荐
- OnPreferenceChangeListener分析,以及与OnPreferenceClickListener的区别
- OnPreferenceChangeListener与OnPreferenceClickListener的分析
- OnPreferenceChangeListener,OnPreferenceClickListener
- viewpager.addOnPageChangeListener三个重写方法参数分析
- 【起航计划 031】2015 起航计划 Android APIDemo的魔鬼步伐 30 App->Preferences->Advanced preferences 自定义preference OnPreferenceChangeListener
- OnFocusChangeListener接口简介以及案例分析
- 按键分析--APP部分-- OnLongClickListener事件处理流程
- Preference中setOnPreferenceClickListener和setOnPreferenceChangeListener的区别
- OnTouchListener、OnClickListener、OnLongClickListener三种监听状态分析
- SharePreference 注册 registerOnSharedPreferenceChangeListener 无法回调的问题
- ViewPager的滑动方法setOnPageChangeListener已被addOnPageChangeListener取代
- ViewPager的setOnPageChangeListener方法详解
- android onClickListener onLongClickListener事件冲突
- 下拉框的触发事件分析(onchange、onfocus、onclick)
- ViewPager的setOnPageChangeListener方法不推荐使用
- setOnItemSelectedListener、setOnItemClickListener与setOnTouchlistener的区别
- CheckBox多选按钮实现CompoundButton.OnCheckedChangeListener
- OnItemClickListener和OnItemSelectedListener的区别
- [Android分享] ViewPager的setOnPageChangeListener方法详解
- ViewPager的setOnPageChangeListener方法详解