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
可以将上面的preference.xml中代码修改如下,就可实现嵌套设置菜单
将上面xml文件中间那两个PreferenceScreen改为PreferenceCategory就可以看到PreferenceCategory的显示效果了
Android系统提供的还有以对话框显示的DialogPreference,可以输入文本的EditTextPreference,以列表方式显示供选择的ListPreference和设置铃声用的RingtonePreference。
详细请看:在上面我们提到Android不再推荐直接让PreferenceActivity加载选项设置布局文件,下面我们来看看PreferenceActivity与PreferenceFragment结合使用。
PreferenceActivity加载的选项设置列表布局文件如下:
上面代码中Prefs1Fragment、Prefs2Fragment是两个内部类
在PreferenceActivity中重写onBuidHeaders方法来加载上面的页面布局
public void onBuildHeaders(ListPreferenceActivity内部还有两个内部类,代码如下:target) { // 加载选项设置列表的布局文件 loadHeadersFromResource(R.xml.preference_headers, target); }
/** * */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在两个Fragment中我们使用addPreferencesFromResource方法来加载设置的布局文件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(); } } }
preference.xml
display_prefs.xml
运行结果: