天天看點

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

}