`
mypyg
  • 浏览: 549395 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Android PreferenceActivity 学习笔记

阅读更多
在Ap中有时需要设置一些配置参数,这些参数通过配置文件保存。
为了设置这些参数,需要提供一个UI,针对这种需求,Android提供了preferenceActivity。

PreferenceActivity通过读取预先定义的xml文件来生成界面,并能够自动的根据用户的操作来修改参数,并保存到配置文件中供读取。

1.MainActivity:
按下Menu按键弹出菜单,点击菜单启动SettingActivity。
2.SettingActivity继承自PreferenceActivity:
@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		addPreferencesFromResource(R.xml.settings);
	}

在onCreate函数中加载参数定义文件。
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key);

当参数值被改变时会调用此Listener,可以在此Listener中作一些界面刷新工作,比如当前参数值改变为新的值。
Preference android.preference.PreferenceActivity.findPreference(CharSequence key);

获取指定key所对应的preference对象,即使此key在配置文件中尚未保存,也能够得到preference对象,而不会是null。
3.settings.xml:保存在xml目中的参数定义文件,在创建Android XML文件时选择Preference即可创建一个空的参数定义文件。
<?xml version="1.0" encoding="utf-8"?>
	<PreferenceScreen
 		xmlns:android="http://schemas.android.com/apk/res/android">
	</PreferenceScreen>

添加一个CheckBoxPreference子项,并设置属性:
Key:checkbox_key
Title:CheckBox Item
Summary:test check box item
<?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 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:
<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()函数:
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时,就会弹出对话框,然后在合适的时机使用如下代码保存参数即可。
SharedPreferences.Editor editor = preference.getEditor();
	editor.putLong("ttt", 123);
	editor.commit();

此种方法如果要触发onSharedPreferenceChanged(),可以通过preference.getOnPreferenceChangeListener()获取listener然后来呼叫。
3.2自定义选项类:
此处以一个选择时间的对话框选项为例。
3.2.1 从DialogPreference继承一个类:
public class TimePreference extends DialogPreference

3.2.2 构造函数:
public TimePreference(Context context, AttributeSet attrs) {
		super(context, attrs);		
		setDialogLayoutResource(R.layout.time_preference);	//加载布局文件
	}

3.3.3 布局文件:
<?xml version="1.0" encoding="utf-8"?>
	<RelativeLayout
	  xmlns: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中。
@Override
	protected 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 保存值:在对话框关闭时保存值。
@Override
	protected 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:
在参数定义文件中增加:
<cn.demo.pa.TimePreference android:key="time_test" android:title="Test time preference"/>

类似于使用自定义控件。

运行即可看到效果:

3.3.7 使用默认值:
在参数定义文件中增加一个定义:
<cn.demo.pa.TimePreference android:key="time_test" android:title="Test time preference" android:defaultValue="1000000"/>

并且自定的preference类中要实现两个函数:
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
	return a.getString(index);
}

以及
       
@Override
	protected 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中使用保存的值从而可以使用默认值。
  • 大小: 19.1 KB
8
1
分享到:
评论
4 楼 fxiaozj 2014-06-09  
zyp09 写道
很想知道在Mainactivity界面怎么获得TimePreference的TimePicker时间值??

怎么获取?
3 楼 zyp09 2012-12-27  
很想知道在Mainactivity界面怎么获得TimePreference的TimePicker时间值??
2 楼 yinlei714 2011-12-07  
哈哈,太感谢了,我刚接触prefernece,网上找了很多资料都不怎么样,看了你这个,我终于弄出来了,不错,顶!!!!   
1 楼 shiftjava 2011-01-26  
相比其他PreferenceActivity,您的介绍较全,挺好,支持!

相关推荐

    android PreferenceActivity中的组件源码

    android PreferenceActivity中的组件源码~

    Android PreferenceActivity 使用练习

    在Android开发中,PreferenceActivity是用于创建设置界面的一个重要组件。它允许开发者通过XML定义UI元素,如开关、单选按钮、复选框等,并在活动中动态加载这些元素,简化了构建用户设置界面的过程。本篇文章将深入...

    Android PreferenceActivity

    在Android开发中,`PreferenceActivity`是用于创建设置界面的一个重要组件。它是Android SDK提供的一种特殊类型的Activity,专门用于展示用户可配置的设置项。在深入理解`PreferenceActivity`之前,我们先要明白`...

    PreferenceActivity用法简介Android X

    PreferenceActivity用法简介 Android X

    Android 属性页PreferenceActivity的实现

    在Android开发中,`PreferenceActivity`是用于创建用户设置界面的一种特殊类型的Activity。它使得开发者可以轻松地构建具有各种设置选项的界面,如开关、单选按钮、复选框等,而无需从头编写大量的XML和Java代码。...

    Android之PreferenceActivity简介

    ### Android之PreferenceActivity详解 #### 一、PreferenceActivity概述 **PreferenceActivity** 是Android系统提供的一种专门用于展示和管理应用设置界面的Activity。它能够帮助开发者快速构建美观且功能丰富的...

    Android软件开发之PreferenceActivity中组件的使用

    在Android应用开发中,PreferenceActivity是用于创建设置界面的一个特殊Activity。它允许开发者以XML方式定义用户界面元素,如开关、选择列表等,使得创建设置界面变得更加简洁和规范。本教程将深入探讨如何在...

    AndroidPreferenceActivity:提供Android PreferenceActivity的替代实现

    “ AndroidPreferenceActivity”是一个Android库,它提供了Android SDK内置的PreferenceActivity的替代实现。 这样的活动提供了对分类偏好的可视化。 活动的外观取决于设备显示屏的大小。 在具有小屏幕的设备上,...

    android中PreferenceActivity详解

    标题与描述均提及了《Android中PreferenceActivity详解》,这一主题涉及了Android开发中关于用户偏好设置的核心组件——PreferenceActivity的深入解析。以下是基于标题、描述、标签以及部分内容的关键知识点总结,...

    Android PreferenceActivity与PreferenceFragment详解及简单实例

    import android.preference.PreferenceActivity; public class PreferencesActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate...

    Android之PreferenceActivity.doc

    PreferenceActivity在Android开发中主要用于构建设置界面,类似于iOS中的偏好设置。它是一个特殊的Activity,用于展示和管理用户配置项,通常包含各种可交互的控件,如开关按钮、列表选择和输入框等,用于保存用户的...

    PreferenceActivity简介

    PreferenceActivity是Android系统中用于构建设置界面的一种特殊Activity。它主要处理用户在设置应用中进行的各种偏好设置,如开关按钮、选择列表等。在Android开发中,为应用程序创建自定义设置界面时,开发者经常会...

    AndroidPreferenceActivity:提供Android PreferenceActivity的替代实现-开源

    “ AndroidPreferenceActivity”是一个Android库,它提供了Android SDK内置的PreferenceActivity的替代实现。 这样的活动提供了对分类偏好的可视化。 活动的外观取决于设备显示屏的大小。 在具有小屏幕的设备上,...

    Android至PreferenceActivity

    ### Android之PreferenceActivity详解 #### 一、Introduction 在Android开发过程中,经常需要为应用提供一个用户可配置的界面,以便于用户能够调整各种设置。PreferenceActivity正是Android平台提供的一个非常实用...

    PreferenceActivity

    使用 PreferenceActivity设置个性信息, 参考:android 设置类PreferenceActivity http://blog.csdn.net/xiaobijia/article/details/41479235

    Android之PreferenceActivity应用详解

    PreferenceActivity是Android系统提供的一种特殊类型的Activity,专门用于创建设置界面。它简化了构建具有各种配置选项的界面的过程,如开关、列表选择等。在需求中,如果你需要创建一个Activity来处理手机属性设置...

    preferenceActivity的简单使用

    在Android开发中,`PreferenceActivity`是用于创建设置界面的一种特殊类型的Activity,它允许开发者以声明式的方式构建用户界面,通常用于应用的设置菜单。在本教程中,我们将深入探讨`PreferenceActivity`的使用,...

Global site tag (gtag.js) - Google Analytics