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







  • 相关阅读:
    Power BI 根据用户权限动态生成导航跳转目标
    Power BI Tooltips 增强功能
    Power BI refresh error “could not load file or assembly…provided impersonation level is invalid”
    SQL 错误代码 18456
    如何使用SQL Server Integration Services从多个Excel文件读取数据
    通过表格编辑器将现有表引入Power BI数据流
    Power BI 中动态增长的柱状图
    ambari2.7.3离线安装hdp3.1.0时,ambari-hdp-1.repo中baseurl无值
    ambari 安装 cannot download file mysql-connector-java from http://8080/resource/mysql-connector-java.jar
    洛谷P4180 [BJWC2010]严格次小生成树
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6469227.html
Copyright © 2011-2022 走看看