zoukankan      html  css  js  c++  java
  • 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







  • 相关阅读:
    MVC架构模式
    Promise对象
    Trick:如何去掉html标签点击时的蓝色边框
    动态REM
    Ajax 详解及CORS
    数据预测之BP神经网络具体应用以及matlab代码
    Pearson相关系数
    Java linux lame .wav音频转mp3 并且压缩
    JavaWeb向浏览器返回一个音频流
    Tomcat 运行 idea 编译好的 .class JavaWeb 项目
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6469227.html
Copyright © 2011-2022 走看看