PreferenceActivity的使用

PreferenceActivity是一个非常有用的基类,当我们开发Android项目时避免不了选项设置,这些设置习惯用Preference来保存。Android专门为这种Activity提供了便捷的基类PreferenceActivity。如果继承自Preference则不需要自己控制Preference的读写,PreferenceActivity会为我们处理一切。

PreferenceActivity与普通的Activity不同,它不是使用界面布局文件,而是使用选项设置的布局文件。

选项设置布局文件以PreferenceScreen作为根元素来表示定义一个参数设置界面布局。

从3.0以后Android不再推荐直接让PreferenceActivity加载选项设置布局文件,而是建议将PreferenceActivity与PreferenceFragment结合使用。

先新建一个工程:


Activity继承自PreferenceActivity

package com.example.testpreferenceactivity;

import android.os.Bundle;
import android.preference.PreferenceActivity;

public class MainActivity extends PreferenceActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//setContentView(R.layout.activity_main);
		addPreferencesFromResource(R.xml.preference);
	}
}

在res目录下新建立一个xml目录,在该目录中建立preference.xml

<?xml version="1.0" encoding="UTF-8"?>
<PreferenceScreen 
	xmlns:android="http://schemas.android.com/apk/res/android" 
	android:title="Settings">
	<CheckBoxPreference 
		android:title="Love me?" 
		android:summaryOn="Yes,I love you!"
		android:summaryOff="No,I am sorry."
		android:defaultValue="true">
	</CheckBoxPreference>
</PreferenceScreen>

可以将上面的preference.xml中代码修改如下,就可实现嵌套设置菜单

<?xml version="1.0" encoding="UTF-8"?>
<PreferenceScreen 
	xmlns:android="http://schemas.android.com/apk/res/android" 
	android:title="Settings">
	<PreferenceScreen 
		xmlns:android="http://schemas.android.com/apk/res/android"
		android:title="Emotions"
		android:summary="settings about emotions">
		<CheckBoxPreference  
			android:title="Love me?" 
			android:summaryOn="Yes,I love you!"
			android:summaryOff="No,I am sorry."
			android:defaultValue="true">
		</CheckBoxPreference>
		<CheckBoxPreference 
			android:title="Hate me?" 
			android:summaryOn="Yes,I hate you!"
			android:summaryOff="No,you are a good person."
			android:defaultValue="false">
		</CheckBoxPreference>		
	</PreferenceScreen>
	<PreferenceScreen 
		xmlns:android="http://schemas.android.com/apk/res/android"
		android:title="Relations"
		android:summary="settings about relations">
		<CheckBoxPreference 
			android:title="Family?" 
			android:summaryOn="Yes,we are family!"
			android:summaryOff="No,I am sorry."
			android:defaultValue="true">
		</CheckBoxPreference>
		<CheckBoxPreference 
			android:title="Friends?" 
			android:summaryOn="Yes,we are friends!"
			android:summaryOff="No,I am sorry."
			android:defaultValue="false">
		</CheckBoxPreference>		
	</PreferenceScreen>	
</PreferenceScreen>
将上面xml文件中间那两个PreferenceScreen改为PreferenceCategory就可以看到PreferenceCategory的显示效果了

Android系统提供的还有以对话框显示的DialogPreference,可以输入文本的EditTextPreference,以列表方式显示供选择的ListPreference和设置铃声用的RingtonePreference。
详细请看:http://blog.csdn.net/ichliebephone/article/details/5916320

在上面我们提到Android不再推荐直接让PreferenceActivity加载选项设置布局文件,下面我们来看看PreferenceActivity与PreferenceFragment结合使用。

PreferenceActivity加载的选项设置列表布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<preference-headers 
    xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 指定启动指定PreferenceFragment的列表项 -->
	<header android:fragment=
	    "org.crazyit.app.PreferenceActivityTest$Prefs1Fragment"
		android:icon="@drawable/ic_settings_applications"
		android:title="程序选项设置"
		android:summary="设置应用的相关选项" />
    <!-- 指定启动指定PreferenceFragment的列表项 -->	
	<header android:fragment=
		"org.crazyit.app.PreferenceActivityTest$Prefs2Fragment"
		android:icon="@drawable/ic_settings_display"
		android:title="界面选项设置 "
		android:summary="设置显示界面的相关选项">
		<!-- 使用extra可向Activity传入额外的数据 -->
		<extra android:name="website"
			android:value="www.crazyit.org" />
	</header>
	<!-- 使用Intent启动指定Activity的列表项 -->
	<header
		android:icon="@drawable/ic_settings_display"
		android:title="使用Intent"
		android:summary="使用Intent启动某个Activity">
		<intent	android:action="android.intent.action.VIEW"
			android:data="http://www.crazyit.org" />
	</header>
</preference-headers>
上面代码中Prefs1Fragment、Prefs2Fragment是两个内部类

在PreferenceActivity中重写onBuidHeaders方法来加载上面的页面布局

	public void onBuildHeaders(List<Header> target)
	{
		// 加载选项设置列表的布局文件
		loadHeadersFromResource(R.xml.preference_headers, target);
	}
PreferenceActivity内部还有两个内部类,代码如下:

/**
 *
 */
package org.crazyit.app;

import java.util.List;

import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.widget.Button;
import android.widget.Toast;


public class PreferenceActivityTest extends PreferenceActivity
{
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		// 该方法用于为该界面设置一个标题按钮
		if (hasHeaders())
		{
			Button button = new Button(this);
			button.setText("设置操作");
			// 将该按钮添加到该界面上
			setListFooter(button);
		}
	}
	// 重写该该方法,负责加载页面布局文件
	@Override
	public void onBuildHeaders(List<Header> target)
	{
		// 加载选项设置列表的布局文件
		loadHeadersFromResource(R.xml.preference_headers, target);
	}

	public static class Prefs1Fragment extends PreferenceFragment
	{
		@Override
		public void onCreate(Bundle savedInstanceState)
		{
			super.onCreate(savedInstanceState);
			addPreferencesFromResource(R.xml.preferences);
		}
	}
	public static class Prefs2Fragment extends PreferenceFragment
	{
		@Override
		public void onCreate(Bundle savedInstanceState)
		{
			super.onCreate(savedInstanceState);
			addPreferencesFromResource(R.xml.display_prefs);
			// 获取传入该Fragment的参数
			String website = getArguments().getString("website");
			Toast.makeText(getActivity()
				, "网站域名是:" + website , Toast.LENGTH_LONG).show();
		}
	}	
}
在两个Fragment中我们使用addPreferencesFromResource方法来加载设置的布局文件

preference.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 设置系统铃声 -->
<RingtonePreference
	android:ringtoneType="all"
	android:title="设置铃声"
	android:summary="选择铃声(测试RingtonePreference)"
	android:showDefault="true"
	android:key="ring_key"
	android:showSilent="true">
</RingtonePreference>
<PreferenceCategory android:title="个人信息设置组">
	<!-- 通过输入框填写用户名 -->
	<EditTextPreference
		android:key="name"
		android:title="填写用户名"
		android:summary="填写您的用户名(测试EditTextPreference)"
		android:dialogTitle="您所使用的用户名为:" />
	<!-- 通过列表框选择性别 -->
	<ListPreference
		android:key="gender"
		android:title="性别"
		android:summary="选择您的性别(测试ListPreference)"
		android:dialogTitle="ListPreference"
		android:entries="@array/gender_name_list"
		android:entryValues="@array/gender_value_list" />
</PreferenceCategory>
<PreferenceCategory android:title="系统功能设置组 ">
	<CheckBoxPreference
		android:key="autoSave"
		android:title="自动保存进度"
		android:summaryOn="自动保存: 开启"
		android:summaryOff="自动保存: 关闭"
		android:defaultValue="true" />
</PreferenceCategory>	
</PreferenceScreen>
display_prefs.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="背景灯光组">
	<!-- 通过列表框选择灯光强度 -->
	<ListPreference
		android:key="light"
		android:title="灯光强度"
		android:summary="请选择灯光强度(测试ListPreference)"
		android:dialogTitle="请选择灯光强度"
		android:entries="@array/light_strength_list"
		android:entryValues="@array/light_value_list" />
</PreferenceCategory>
<PreferenceCategory android:title="文字显示组 ">
	<!-- 通过SwitchPreference设置是否自动滚屏 -->
	<SwitchPreference
		android:key="autoScroll"
		android:title="自动滚屏"
		android:summaryOn="自动滚屏: 开启"
		android:summaryOff="自动滚屏: 关闭"
		android:defaultValue="true" />
</PreferenceCategory>
</PreferenceScreen>

运行结果:



源代码下载:http://download.csdn.net/detail/lxq_xsyu/6915019







原文地址:https://www.cnblogs.com/lanzhi/p/6469227.html