当应用需要保存用户设置信息的时候,我们可以使用前面所介绍的Activity+Preference完成,但要实现下图所示的界面,这种方式就显的有点麻烦,此时我们可以使用Android为我们提供的用于设置界面的组件,那就是PreferenceActivity。
PreferenceActivity的主要特点就是可以通过添加各种各样的Preference UI控件,在用户做完喜好设置过后,将这些Preference UI控件的状态持久化储存起来。其中,Android SDK提供了4种Preference UI的控件,分别是:
CheckBoxPreference控件:CheckBox选择项,对应的值的ture或flase
EditTextPreference控件:输入编辑框,值为String类型,会弹出对话框供输入。
ListPreference控件: 列表选择,弹出对话框供选择。
RingtonePreference控件:系统玲声选择。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICMzEDMyAzMzETNyQDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
下面就上图所示界面的实现进行说明
(1)新建工程PreferenceActivityDemo,在res目录下面新建xml子目录,右击xml子目录,选择new|other|Android XML File命令,在弹出的对话框中的Resouce Type下拉列表中选择Preference选项,在File输入框中输入preference_demo.xml,单击Finish按钮。
(2)编辑preference_demo.xml,源代码如下:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory android:title="账号信息" >
<EditTextPreference
android:defaultValue="请输入昵称"
android:dialogTitle="昵称输入"
android:key="nickname"
android:summary="用户昵称"
android:title="昵称" />
<ListPreference
android:dialogTitle="性别"
android:key="sex"
android:title="性别" />
</PreferenceCategory>
<PreferenceCategory android:title="推送设置" >
<RingtonePreference
android:key="ring"
android:ringtoneType="all"
android:showSilent="true"
android:title="铃声设置" />
<CheckBoxPreference
android:defaultValue="true"
android:key="push"
android:summaryOff="不接受推送"
android:summaryOn="接受推送"
android:title="推送开关" />
</PreferenceCategory>
</PreferenceScreen>
(3)新建一个MainActivity继承PreferenceActivity,代码及说明如下:
package com.example.preferenceactivitydemo;
import android.content.SharedPreferences;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.widget.Toast;
import android.preference.PreferenceActivity;
import android.preference.RingtonePreference;
public class MainActivity extends PreferenceActivity {
String[] sex_rank_array = { "男", "女" };
String[] sex_rank_value_array = { "0", "1" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preference_demo);// 加载Preference描述文件
// CheckBoxPreference控件
CheckBoxPreference checkBoxPreference = (CheckBoxPreference) findPreference("push");// 根据key值找到控件
// 当Preference控件被点击时,触发该方法。
checkBoxPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Toast.makeText(getApplicationContext(), "是否推送:" + newValue, Toast.LENGTH_LONG).show();
return true;// 返回true时更新响应的存储值
}
});
// RingtonePreference控件
final RingtonePreference ringtonePreference = (RingtonePreference) findPreference("ring");
final SharedPreferences sp = ringtonePreference.getPreferenceManager().getSharedPreferences();
ringtonePreference.setSummary(getRingtonName(sp.getString("ring1", "")));
ringtonePreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
ringtonePreference.setSummary(getRingtonName(newValue.toString()));// newValue是一个uriString
sp.edit().putString("ring1", newValue.toString()).commit();// 获取存储的Uri值,保存的文件路径在/data/data/[PackageName]/shared_prefs/[PackageName]_preferences.xml中
return true;
}
});
// ListPreference控件
final ListPreference listPreference = (ListPreference) findPreference("sex");
listPreference.setEntries(sex_rank_array);
listPreference.setEntryValues(sex_rank_value_array);
listPreference.setSummary(listPreference.getEntry());
listPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Toast.makeText(getApplicationContext(), "性别:" + newValue, Toast.LENGTH_LONG).show();
listPreference.setSummary(sex_rank_array[Integer.parseInt(newValue + "")]);
return true;
}
});
// EditTextPreference控件
final EditTextPreference eitTextPreference = (EditTextPreference) findPreference("nickname");
eitTextPreference.setSummary(eitTextPreference.getText());// getText()返回的是我们之前sharedPreferen文件保存的值
eitTextPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
eitTextPreference.setSummary(newValue.toString());
return true;
}
});
}
// 通过Uri查询系统铃声的名称
public String getRingtonName(String uriString) {
Uri uri = Uri.parse(uriString);
Ringtone r = RingtoneManager.getRingtone(this, uri);
return r.getTitle(this);
}
}