1.PreferenceActivity主要應用與對用戶的偏好設置,通過它的命名也可以看出來這點!
我們都知道Android持久化有四種:SQLite、文件存儲、Preference、ContentProvider
而其中Preference是以類似Map的鍵值對形式存儲的,最適合用來保存用戶個人設置之類的信息
2.怎麼來使用呢,只要一個類繼承它,並添加一個xml文件來創建它的頁面就可以了!
a.首先在res目錄下建立一個xml文件夾,然後新建一個preferences.xml文件
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="@string/steps_settings_title">
<ListPreference
android:key="sensitivity"
android:title="@string/sensitivity_setting"
android:summary="@string/sensitivity_setting_details"
android:entries="@array/sensitivity_preference"
android:entryValues="@array/sensitivity_preference_values"
android:dialogTitle="@string/sensitivity_setting_title"
android:defaultValue="30" />
<ListPreference
android:key="operation_level"
android:title="@string/operation_level_setting"
android:summary="@string/operation_level_setting_details"
android:entries="@array/operation_level_preference"
android:entryValues="@array/operation_level_preference_values"
android:dialogTitle="@string/operation_level_setting_title"
android:defaultValue="30" />
<ListPreference
android:key="units"
android:title="@string/units_setting"
android:summary="@string/units_setting_details"
android:entries="@array/units_preference"
android:entryValues="@array/units_preference_values"
android:dialogTitle="@string/units_setting_title"
android:defaultValue="imperial" />
<cq.cake.pedometer.perferences.StepLengthPreference
android:key="step_length"
android:title="@string/step_length_setting"
android:summary="@string/step_length_setting_details"
android:dialogTitle="@string/step_length_setting_title"
android:defaultValue="20" />
<cq.cake.pedometer.perferences.BodyWeightPreference
android:key="body_weight"
android:title="@string/body_weight_setting"
android:summary="@string/body_weight_setting_details"
android:dialogTitle="@string/body_weight_setting_title"
android:defaultValue="50" />
<ListPreference
android:key="exercise_type"
android:title="@string/exercise_type_setting"
android:summary="@string/exercise_type_setting_details"
android:entries="@array/exercise_type_preference"
android:entryValues="@array/exercise_type_preference_values"
android:dialogTitle="@string/exercise_type_setting_title"
android:defaultValue="running" />
<ListPreference
android:key="maintain"
android:title="@string/maintain_setting"
android:summary="@string/maintain_setting_details"
android:entries="@array/maintain_preference"
android:entryValues="@array/maintain_preference_values"
android:dialogTitle="@string/maintain_setting_title"
android:defaultValue="none" />
</PreferenceCategory>
<PreferenceCategory
android:title="@string/voice_settings_title">
<CheckBoxPreference
android:key="speak"
android:title="@string/voice_setting"
android:summary="@string/voice_setting_details"
android:defaultValue="false" />
<ListPreference
android:key="speaking_interval"
android:title="@string/speaking_interval_setting"
android:summary="@string/speaking_interval_setting_details"
android:entries="@array/speaking_interval_preference"
android:entryValues="@array/speaking_interval_preference_values"
android:dependency="speak"
android:defaultValue="1" />
<PreferenceScreen
android:key="tell_what"
android:title="@string/tell_what"
android:dependency="speak">
<PreferenceCategory
android:title="@string/tell_what">
<CheckBoxPreference
android:key="tell_steps"
android:title="@string/tell_steps_setting"
android:summary="@string/tell_steps_setting_details"
android:defaultValue="false" />
<CheckBoxPreference
android:key="tell_pace"
android:title="@string/tell_pace_setting"
android:summary="@string/tell_pace_setting_details"
android:defaultValue="false" />
<CheckBoxPreference
android:key="tell_distance"
android:title="@string/tell_distance_setting"
android:summary="@string/tell_distance_setting_details"
android:defaultValue="false" />
<CheckBoxPreference
android:key="tell_speed"
android:title="@string/tell_speed_setting"
android:summary="@string/tell_speed_setting_details"
android:defaultValue="false" />
<CheckBoxPreference
android:key="tell_calories"
android:title="@string/tell_calories_setting"
android:summary="@string/tell_calories_setting_details"
android:defaultValue="false" />
<CheckBoxPreference
android:key="tell_fasterslower"
android:title="@string/tell_fasterslower_setting"
android:summary="@string/tell_fasterslower_setting_details"
android:defaultValue="false" />
</PreferenceCategory>
</PreferenceScreen>
</PreferenceCategory>
</PreferenceScreen>
b.然後創建一個Settings類來繼承PreferenceActivity,在onCreate裏面添加這個xml
package cq.cake.pedometer;
import android.os.Bundle;
import android.preference.PreferenceActivity;
public class Settings extends PreferenceActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
a-1 其中ListPreference是一個讓用戶選擇列表的形式出現控件,其中key代表鍵值,用於其它地方需要這個值得時候,通過PreferenceManager.getDefaultSharedPreferences(Context)的靜態方法,獲取到一個全局的Preference對象,再通過這個對象的get相關方法取值,例如:
SharedPreferences setPreference = PreferenceManager.getDefaultSharedPreferences(this);
setPreference.getString("sensitivity","中等");//這裏默認就是取的【中等】值,如果沒有的話
例如這張圖片,可以選擇極低,但如果是第一次沒有選擇,則默認使用中等這個值
還有的屬性:title:標題 summary:描述 entries:顯示給用戶的數組值,我們可以保存在values下面的arrays.xml中,entryValues就是實際的數組值,dialogTitle表示彈出來的標題,defaultValue就是默認設置的值
<string-array name="sensitivity_preference">
<item>@string/extra_high</item>
<item>@string/very_high</item>
<item>@string/high</item>
<item>@string/higher</item>
<item>@string/medium</item>
<item>@string/lower</item>
<item>@string/low</item>
<item>@string/very_low</item>
<item>@string/extra_low</item>
</string-array>
<string-array name="sensitivity_preference_values">
<item>1.9753</item>
<item>2.9630</item>
<item>4.4444</item><!-- 10 * 1.5^(-2) -->
<item>6.6667</item><!-- 10 * 1.5^(-1) -->
<item>10</item>
<item>15</item><!-- 10 * 1.5 -->
<item>22.5</item><!-- 10 * 1.5^2 -->
<item>33.75</item>
<item>50.625</item>
</string-array>
a-2 EditTextPreference,爲文本編輯框配置控件,上面的preferences.xml中的StepLengthPreference自定義類就是繼承了它,裏面的屬性和第一個控件意思一樣
a-3 CheckBoxPreference,就是單選的喜好控件,其他屬性一樣,最後一個屬性defaultValue只能輸入false或true,代表了真假,和普通的CheckBox樣式區別不大,只是它是Preference類型的控件而已
a-4 PreferenceScreen代表了新的喜好界面,可以在這裏面嵌套它,點擊又會生成新的喜好界面。
a-5 PreferenceCategory就是喜歡界面的下個分組標籤,代表了一組屬性值