前言
我們在進行Android開發(fā)的過程中,有時需要實現(xiàn)一個設置界面,就像下面的系統(tǒng)的顯示設置。這樣的界面自己實現(xiàn)起來略顯繁瑣,好在Android中已經(jīng)實現(xiàn)了這樣的設置界面,那就是PreferenceActivity。并且PreferenceActivity還有一個莫大的好處,配置信息會自動使用SharedPreferences進行保存,無需我們自己實現(xiàn)。

使用方法
如果我們有許多類設置項,我們可以把設置分頁。將PreferenceActivity和PreferenceFragment結合使用,其中PreferenceActivity只是負責加載選項設置列表的布局文件。
- 配置選項設置列表
選項設置列表需要通過xml文件進行配置,現(xiàn)在res目錄下新建xml目錄,建立preference_home.xml文件。使用preference-headers作為根節(jié)點,配置內(nèi)容為<?xml version="1.0" encoding="utf-8"?> <preference-headers xmlns:android="http://schemas.android.com/apk/res/android"> <header android:fragment="com.sunny.handlertest.MyPreferenceActivity$Prefs1Fragment" android:icon="@mipmap/ic_launcher" android:summary="設置第一個參數(shù)" android:title="設置1" /> <header android:fragment="com.sunny.handlertest.MyPreferenceActivity$Pref2Fragment" android:icon="@mipmap/ic_launcher" android:summary="設置第二個參數(shù)" android:title="設置2" /> <header android:icon="@mipmap/ic_launcher" android:summary="view baidu website" android:title="baidu"> <intent android:action="android.intent.action.VIEW" android:data="https://m.baidu.com/" /> </header> </preference-headers>
我們?yōu)槊恳豁?code>header設置點擊后的fragment路徑,標題,圖標等。并且可以加入intent,如第三個header,點擊以后會打開百度的網(wǎng)站。
下面來編寫代碼,新建一個類MyPreferenceActivity并繼承PreferenceActivity。實現(xiàn)兩個靜態(tài)內(nèi)部類,繼承PreferenceFragment。
在onCreate中,我們可以利用setListFooter()給界面設置一個底部按鈕之類的東西。
要想加載配置文件,需要重寫onBuildHeaders()方法,并使用loadHeadersFromResource(R.xml.preference_home, target)來加載我們的配置文件。
需要注意的是,在Android 4.4及以上的的版本中,還要實現(xiàn)isValidFragment()方法,否則會有運行時錯誤,這個回調函數(shù),會傳遞給我們fragment類的路徑,我們要判斷是否是有效路徑,如果是,就返回true。在這里為了簡單,直接返回true。
public class MyPreferenceActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (hasHeaders()) {
Button button = new Button(this);
button.setText("Exit");
setListFooter(button);
}
}
@Override
protected boolean isValidFragment(String fragmentName) {
System.out.println(fragmentName);
return true;
}
@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.preference_home, target);
}
public static class Prefs1Fragment extends PreferenceFragment {
}
public static class Pref2Fragment extends PreferenceFragment {
}
}
這一步實現(xiàn)的效果如圖

- 配置詳細設置
新建一個配置文件preference_frag1.xml,設置根節(jié)點為PreferenceScreen,代碼如下
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="設置組1">
<EditTextPreference
android:dialogTitle="輸入您的名字"
android:key="name"
android:singleLine="true"
android:summary="設置您的姓名"
android:title="姓名" />
<ListPreference
android:dialogTitle="選擇性別"
android:entries="@array/sex_name"
android:entryValues="@array/sex_value"
android:key="sex"
android:summary="選擇您的性別"
android:title="性別" />
</PreferenceCategory>
<PreferenceCategory android:title="設置組2">
<CheckBoxPreference
android:defaultValue="true"
android:key="isOk"
android:summaryOff="關閉"
android:summaryOn="打開"
android:title="推送" />
<SwitchPreference
android:defaultValue="false"
android:key="autoRun"
android:summaryOff="關"
android:summaryOn="開"
android:title="自啟動" />
</PreferenceCategory>
</PreferenceScreen>
其中PreferenceCategory用于設置分組;EditTextPreference是含有EditText的對話框;ListPreference是含有單選列表的對話框;CheckBoxPreference是單選項;SwitchPreference是開關。
需要注意如下幾點,每一項要設置一個key,這是每一個設置的鍵,在代碼中,可以通過這個鍵找到對應的Preference。ListPreference要配置entries和entryValues這兩個屬性,是數(shù)組類型,分別代表顯示出來的選項和存儲的值,代碼如下
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="sex_name">
<item>男</item>
<item>女</item>
</string-array>
<string-array name="sex_value">
<item>1</item>
<item>0</item>
</string-array>
</resources>
配置好后,我在在Prefs1Fragment的onCreate方法中使用addPreferencesFromResource(R.xml.preference_frag1)就可以載入我們的配置文件啦。通過findPreference()方法,還可以找到key對應的配置。完整代碼如下
public static class Prefs1Fragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preference_frag1);
String name = ((EditTextPreference) findPreference("name")).getText();
Toast.makeText(getActivity(), name, Toast.LENGTH_SHORT).show();
}
}
效果如圖所示

再說幾句
這是寫的第一篇讀書筆記,以后還會慢慢更新的,努力學習ing
不早了,晚安~o( ̄▽ ̄)ブ**