天天看点

SharedPreferences(系统偏好设置)(二)——PreferenceActivity

当应用需要保存用户设置信息的时候,我们可以使用前面所介绍的Activity+Preference完成,但要实现下图所示的界面,这种方式就显的有点麻烦,此时我们可以使用Android为我们提供的用于设置界面的组件,那就是PreferenceActivity。

PreferenceActivity的主要特点就是可以通过添加各种各样的Preference UI控件,在用户做完喜好设置过后,将这些Preference UI控件的状态持久化储存起来。其中,Android SDK提供了4种Preference UI的控件,分别是:

CheckBoxPreference控件:CheckBox选择项,对应的值的ture或flase

EditTextPreference控件:输入编辑框,值为String类型,会弹出对话框供输入。

ListPreference控件: 列表选择,弹出对话框供选择。

RingtonePreference控件:系统玲声选择。

SharedPreferences(系统偏好设置)(二)——PreferenceActivity
SharedPreferences(系统偏好设置)(二)——PreferenceActivity

下面就上图所示界面的实现进行说明

(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);
    }

}