您的位置:首页 > 移动开发 > Android开发

Android PreferenceActivity 学习笔记

2010-12-29 19:31 453 查看
在Ap中有时需要设置一些配置参数,这些参数通过配置文件保存。为了设置这些参数,需要提供一个UI,针对这种需求,Android提供了preferenceActivity。PreferenceActivity通过读取预先定义的xml文件来生成界面,并能够自动的根据用户的操作来修改参数,并保存到配置文件中供读取。1.MainActivity:按下Menu按键弹出菜单,点击菜单启动SettingActivity。2.SettingActivity继承自PreferenceActivity:Java代码@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);addPreferencesFromResource(R.xml.settings);}
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);addPreferencesFromResource(R.xml.settings);}
在onCreate函数中加载参数定义文件。Java代码public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key);
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key);
当参数值被改变时会调用此Listener,可以在此Listener中作一些界面刷新工作,比如当前参数值改变为新的值。Java代码Preference android.preference.PreferenceActivity.findPreference(CharSequence key);
Preference android.preference.PreferenceActivity.findPreference(CharSequence key);
获取指定key所对应的preference对象,即使此key在配置文件中尚未保存,也能够得到preference对象,而不会是null。3.settings.xml:保存在xml目中的参数定义文件,在创建Android XML文件时选择Preference即可创建一个空的参数定义文件。Xml代码<?xml version="1.0" encoding="utf-8"?><PreferenceScreenxmlns:android="http://schemas.android.com/apk/res/android"></PreferenceScreen>
<?xml version="1.0" encoding="utf-8"?><PreferenceScreenxmlns:android="http://schemas.android.com/apk/res/android"></PreferenceScreen>
添加一个CheckBoxPreference子项,并设置属性:Key:checkbox_keyTitle:CheckBox ItemSummary:test check box itemXml代码<?xml version="1.0" encoding="utf-8"?><PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"><CheckBoxPreference android:key="checkbox_key"android:title="CheckBox Item" android:summary="test check box item"></CheckBoxPreference></PreferenceScreen>
<?xml version="1.0" encoding="utf-8"?><PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"><CheckBoxPreference android:key="checkbox_key"android:title="CheckBox Item" android:summary="test check box item"></CheckBoxPreference></PreferenceScreen>
key是用来访问此参数的值的关键字,保存后的配置文件类似如下内容:Xml代码<?xml version='1.0' encoding='utf-8' standalone='yes' ?><map><boolean name="checkbox_key" value="true" /></map>
<?xml version='1.0' encoding='utf-8' standalone='yes' ?><map><boolean name="checkbox_key" value="true" /></map>
启动Ap,点击菜单,即可看到参数设置界面,并且当用户点击操作改变了参数值后,也会被自动保存。4.使用参数值:SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);boolean check_test = sp.getBoolean("checkbox_key", false);进阶:1.保存参数文件的路径:/data/data/包名/shared_prefs/包名_preferences.xml如果想指定保存文件名,可使用:getPreferenceManager().setSharedPreferencesName("配置文件名");2.其他的参数配置项:2.1 EditTextPreference:Xml代码<EditTextPreference android:dialogTitle="Edit Text Dialog"android:key="edittext_key" android:dialogMessage="Please Input text"android:title="EditText Item" android:summary="test edittext item"></EditTextPreference>
<EditTextPreference android:dialogTitle="Edit Text Dialog"android:key="edittext_key" android:dialogMessage="Please Input text"android:title="EditText Item" android:summary="test edittext item"></EditTextPreference>
此参数设置项会弹出一个文本输入对话框,并在配置文件中生成类似以下内容:<string name="edittext_key">this is a good text</string>弹出对话框的图标、标题、提示信息、Icon、以及两个按钮的文本都可以设定。至于自定义对话框的布局,虽然有这个属性,但是自定义布局后就不能自动保存值了,本来以为只要放一个ID和原来一样的EditText就能,但是查看源代码,发现其EditText是new出来的,没法替代。2.2 PreferenceCategory:一个分类分隔条。只有title属性有效。2.3 PreferenceScreen:此项包含的所有子项在新屏幕上显示,就好像进入二级菜单。2.4 ListPreference:会弹出一个列表对话框供选择。2.5 RingtonePreference:会弹出系统铃声列表供选择。2.6 Preference:通用参数项。点击后需要程序自己响应事件。3.自定义选项:系统的提供的界面有时不能满足需要,这时就需要自定义选项了。有两种方法可以实现自定义选项,一是用Preference作为选项,并重新实现onPreferenceTreeClick函数。一是自定义一个类,类似于EditTextPreference这种系统内置的类,然后引用。3.1使用一个Preference占位,然后重新实现onPreferenceTreeClick()函数:Java代码public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {String key = preference.getKey();if( key != null ){if(key.equals("some_key")) {showDialog(DIALOG_SOME_KEY);}}return super.onPreferenceTreeClick(preferenceScreen, preference);}
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,	Preference preference) {String key = preference.getKey();if( key != null ){if(key.equals("some_key")) {showDialog(DIALOG_SOME_KEY);}}return super.onPreferenceTreeClick(preferenceScreen, preference);}
当点击指定key的Preference时,就会弹出对话框,然后在合适的时机使用如下代码保存参数即可。Java代码SharedPreferences.Editor editor = preference.getEditor();editor.putLong("ttt", 123);editor.commit();
SharedPreferences.Editor editor = preference.getEditor(); 	editor.putLong("ttt", 123); 	editor.commit();此种方法如果要触发onSharedPreferenceChanged(),可以通过preference.getOnPreferenceChangeListener()获取listener然后来呼叫。3.2自定义选项类:此处以一个选择时间的对话框选项为例。3.2.1 从DialogPreference继承一个类:Java代码public class TimePreference extends DialogPreference
public class TimePreference extends DialogPreference
3.2.2 构造函数:Java代码public TimePreference(Context context, AttributeSet attrs) {super(context, attrs);setDialogLayoutResource(R.layout.time_preference); //加载布局文件}
public TimePreference(Context context, AttributeSet attrs) {super(context, attrs);setDialogLayoutResource(R.layout.time_preference);	//加载布局文件}
3.3.3 布局文件:Xml代码<?xml version="1.0" encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"><TimePicker android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/timePicker_preference" android:layout_centerHorizontal="true"></TimePicker></RelativeLayout>
<?xml version="1.0" encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"><TimePicker android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/timePicker_preference" android:layout_centerHorizontal="true"></TimePicker></RelativeLayout>
定义了一个id为timePicker_preference的TimePicker。3.3.4 界面初始化:在dialog的函数中通过id找到TimePicker,然后使用已经存储的值或者默认值,再设置到TimerPicker中。Java代码@Overrideprotected void onBindDialogView(View view) {super.onBindDialogView(view);mPicker = (TimePicker)view.findViewById(R.id.timePicker_preference);if(mPicker != null) {mPicker.setIs24HourView(true);long value = mValue;Date d = new Date(value);mPicker.setCurrentHour(d.getHours());mPicker.setCurrentMinute(d.getMinutes());}}
@Overrideprotected void onBindDialogView(View view) {super.onBindDialogView(view);mPicker = (TimePicker)view.findViewById(R.id.timePicker_preference);if(mPicker != null) {mPicker.setIs24HourView(true);long value = mValue;Date d = new Date(value);mPicker.setCurrentHour(d.getHours());mPicker.setCurrentMinute(d.getMinutes());}}
3.3.5 保存值:在对话框关闭时保存值。Java代码@Overrideprotected void onDialogClosed(boolean positiveResult) {super.onDialogClosed(positiveResult);if(positiveResult) {Date d = new Date(0, 0, 0, mPicker.getCurrentHour(), mPicker.getCurrentMinute(), 0);long value = d.getTime();if(callChangeListener(value)) {setValue(value);}}}
@Overrideprotected void onDialogClosed(boolean positiveResult) {super.onDialogClosed(positiveResult);if(positiveResult) {Date d = new Date(0, 0, 0, mPicker.getCurrentHour(), mPicker.getCurrentMinute(), 0);long value = d.getTime();if(callChangeListener(value)) {setValue(value);}}}
3.3.6 使用此preference:在参数定义文件中增加:Xml代码<cn.demo.pa.TimePreference android:key="time_test" android:title="Test time preference"/>
<cn.demo.pa.TimePreference android:key="time_test" android:title="Test time preference"/>
类似于使用自定义控件。运行即可看到效果:3.3.7 使用默认值:在参数定义文件中增加一个定义:Xml代码<cn.demo.pa.TimePreference android:key="time_test" android:title="Test time preference" android:defaultValue="1000000"/>
<cn.demo.pa.TimePreference android:key="time_test" android:title="Test time preference" android:defaultValue="1000000"/>
并且自定的preference类中要实现两个函数:Java代码@Overrideprotected Object onGetDefaultValue(TypedArray a, int index) {return a.getString(index);}
@Overrideprotected Object onGetDefaultValue(TypedArray a, int index) {return a.getString(index);}
以及Java代码@Overrideprotected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {long value;if(restorePersistedValue) value = getPersistedLong(0);else {value = Long.parseLong(defaultValue.toString());}setValue(value);}
@Overrideprotected void onSetInitialValue(boolean restorePersistedValue,	Object defaultValue) {long value;if(restorePersistedValue) value = getPersistedLong(0);else {value = Long.parseLong(defaultValue.toString());}setValue(value);}
当PreferenceActivity启动时会构造TimePreference,此时会调用onGetDefaultValue,然后调用 onSetInitialValue,在onSetInitialValue保存初始值,并在onBindDialogView中使用保存的值从而可以使 用默认值。 http://blog.163.com/guozioo@126/blog/static/6408694720106711453584/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: