PreferenceActivity继承了ListActivity,定义Activity继承PreferenceActivity。在res目录下新建一个xml文件夹,接着在这个文件夹下新建一个取名为preferences.xml的File文件,xml中可以使用的标签(Tag)可以分为两类,一类是管理布局的显示,如PreferenceScreen;另一类是内容设置标签,如CheckBoxPreference。把java文件中的setContentView(R.layout.main)改为addPreferencesFromResource(R.xml.preferences);包含在PreferenceScreen标签里的内容都将以一个完整的页面显示,PreferenceScreen可以嵌套。
<?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"android:key="CheckBoxPreference"></CheckBoxPreference><CheckBoxPreference android:title="Hate me?" android:summaryOn="Yes,I hate you!"android:summaryOff="No,you are a good person."android:defaultValue="false"></CheckBoxPreference><SwitchPreference android:summaryOn="summaryOn"android:summaryOff="summaryOff"android:title="SwitchPreference"android:key="SwitchPreference"/> </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>
由于布局中有三个PreferenceScreen,因此将显示三个页面。和管理布局显示相关的除了PreferenceScreen外,还有一个常用的为PreferenceCategory,如果将以上布局中间那两个PreferenceScreen改为PreferenceCategory,则只显示一个页面,PreferenceCategory只是把包含的内容归为同一类,但只是显示在一个页面中。
当PreferenceActivity中的内容改变时,Android系统会自动进行保存和持久化维护,我们只需要在要用的设置界面中数据的地方进行读取就可以了。同时Android还提供了OnPreferenceClickListener和OnPreferenceChangeListener两个与Preference相关的监听接口,当PreferenceActivity中的某一个Preference进行了点击或者改变的操作时,都会回调接口中的函数,这样可以第一个时间向其他Activity等通知系统设置进行了改变。
public class MainActivity extends PreferenceActivity implements OnPreferenceChangeListener, OnPreferenceClickListener{private CheckBoxPreference cBoxPreference = null;private SwitchPreference switchPreference = null;private final static String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(R.layout.activity_main);//从xml文件中添加Preference项 addPreferencesFromResource(R.xml.preferences);//findPreference函数通过key可以找到对应的设置项cBoxPreference = (CheckBoxPreference)findPreference("CheckBoxPreference");switchPreference = (SwitchPreference)findPreference("SwitchPreference");cBoxPreference.setOnPreferenceChangeListener(this); switchPreference.setOnPreferenceClickListener(this);cBoxPreference.setOnPreferenceChangeListener(this); switchPreference.setOnPreferenceClickListener(this);}/* * (non-Javadoc)* @param preference* @param newValue* @return * @see android.preference.Preference.OnPreferenceChangeListener#onPreferenceChange(android.preference.Preference, java.lang.Object) */@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {// TODO Auto-generated method stub//判断是哪个Preference改变了 if(preference.getKey().equals("CheckBoxPreference")){ Toast.makeText(this, "CheckBoxPreference onPreferenceChange", Toast.LENGTH_SHORT).show();//读取设置信息SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); Boolean cb = settings.getBoolean("CheckBoxPreference", false); Boolean sw = settings.getBoolean("SwitchPreference", false); Toast.makeText(this, "CheckBoxPreference " + (cb ? "true":"false") + " SwitchPreference "+ (sw ? "true":"false"), Toast.LENGTH_SHORT).show();}else if(preference.getKey().equals("SwitchPreference")){ Toast.makeText(this, "SwitchPreference onPreferenceChange", Toast.LENGTH_SHORT).show();//读取设置信息SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); Boolean cb = settings.getBoolean("CheckBoxPreference", false); Boolean sw = settings.getBoolean("SwitchPreference", false); Toast.makeText(this, "CheckBoxPreference " + (cb ? "true":"false") + " SwitchPreference "+ (sw ? "true":"false"), Toast.LENGTH_SHORT).show();}else{ //如果返回false表示不允许被改变 return false; } //返回true表示允许改变 return true; }/* * (non-Javadoc)* @param preference* @return * @see android.preference.Preference.OnPreferenceClickListener#onPreferenceClick(android.preference.Preference) */@Overridepublic boolean onPreferenceClick(Preference preference) {// TODO Auto-generated method stub//判断是哪个Preference改变了 if(preference.getKey().equals("CheckBoxPreference")){ Toast.makeText(this, "CheckBoxPreference onPreferenceChange", Toast.LENGTH_SHORT).show();//读取设置信息SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); Boolean cb = settings.getBoolean("CheckBoxPreference", false); Boolean sw = settings.getBoolean("SwitchPreference", false); Toast.makeText(this, "CheckBoxPreference " + (cb ? "true":"false") + " SwitchPreference "+ (sw ? "true":"false"), Toast.LENGTH_SHORT).show();}else if(preference.getKey().equals("SwitchPreference")){ Toast.makeText(this, "SwitchPreference onPreferenceChange", Toast.LENGTH_SHORT).show();//读取设置信息SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); Boolean cb = settings.getBoolean("CheckBoxPreference", false); Boolean sw = settings.getBoolean("SwitchPreference", false); Toast.makeText(this, "CheckBoxPreference " + (cb ? "true":"false") + " SwitchPreference "+ (sw ? "true":"false"), Toast.LENGTH_SHORT).show();}else{ //如果返回false表示不允许被改变 return false; } //返回true表示允许改变 return true; }
}一个Preference拥有的属性:
1. Key为这个Preference的ID,设置了才可以在代码中引用
2. Title是显示的标题
3. Summary是显示在标题下的文字介绍
4. Dependency中填写一个CheckBoxPreference的Key,这样就会在填写的那个CheckBoxPreference勾选时当前这个Preference才可用Default Value为初始值
内容设置标签包括:
1.对话框显示的DialogPreference
2.输入文本的EditTextPreference
3.列表方式显示供选择的ListPreference
4.设置铃声的RingtonePreference
5.开关切换SwitchPreference
6.多选列表显示MultiSelectListPreference
在应用程序安装目录下,存在一个以应用程序包名为前缀的xml文件保存了所有设置项值:















