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







  • 相关阅读:
    爬虫学习——网页解释器简介
    爬虫学习——urllib2三种方法的实例
    JSLint在idea编译器中报错
    elasticsearch学习之根据发布时间设置衰减函数
    通过Function Score Query优化Elasticsearch搜索结果(综合排序)
    Java中List, Integer[], int[]的相互转换
    CentOS7查看和关闭防火墙
    Elasticsearch 自定义多个分析器
    利用grep-console插件使Intellij idea显示多颜色调试日志
    为ElasticSearch添加HTTP基本认证
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6469227.html
Copyright © 2011-2022 走看看