何時使用 Preference Headers

1. 問題提出:如何處理需要分屏分組的設置項?

在谷歌開發文檔中以Android 3.0版本作爲基線,對此問題進行不同的處理:
  • Android 3.0之前:採用PreferenceScreen嵌套的方法;
  • Android 3.0及之後:採用Preference Headers的方法。

2. 採用 PreferenceScreen 嵌套

採用此方法的preference.xml文件形如:

<PreferenceScreen  xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- opens a subscreen of settings -->
    <PreferenceScreen
        android:key="button_voicemail_category_key"
        android:title="@string/voicemail"
        android:persistent="false">
        <ListPreference
            android:key="button_voicemail_provider_key"
            android:title="@string/voicemail_provider" ... />
        <!-- opens another nested subscreen -->
        <PreferenceScreen
            android:key="button_voicemail_setting_key"
            android:title="@string/voicemail_settings"
            android:persistent="false">
            ...
        </PreferenceScreen>
        <RingtonePreference
            android:key="button_voicemail_ringtone_key"
            android:title="@string/voicemail_ringtone_title"
            android:ringtoneType="notification" ... />
        ...
    </PreferenceScreen>
    ...
</PreferenceScreen>

這樣,所有分屏的設置說明都將集中在一個xml文件中。

3. 採用 Preference Headers

Android 3.0之後,擯棄了傳統的 PreferenceScreen 嵌套方法,而是採用了所謂的 Preference Headers 方法,該方法的要點是:在主屏中通過 headers xml 文件佈局列出所有的主題設置項,而每個主題設置的詳細設置則由各自指定的 PreferenceFragment 負責,而各自的 PreferenceFragment 可以如傳統的 PreferenceActivity 一樣佈局自身的 PreferenceScreen。
headers xml 佈局樣式形如:

<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
    <header 
        android:fragment="com.example.prefs.SettingsActivity$SettingsFragmentOne"
        android:title="@string/prefs_category_one"
        android:summary="@string/prefs_summ_category_one" />
    <header 
        android:fragment="com.example.prefs.SettingsActivity$SettingsFragmentTwo"
        android:title="@string/prefs_category_two"
        android:summary="@string/prefs_summ_category_two" >
        <!-- key/value pairs can be included as arguments for the fragment. -->
        <extra android:name="someKey" android:value="someHeaderValue" />
    </header>
</preference-headers>

另外,爲了能夠顯示出 headers 中的佈局列表,需要在繼承的 PreferenceActivity 類中實現 onBuildHeaders() 回調方法:

public class SettingsActivity extends PreferenceActivity {
    @Override
    public void onBuildHeaders(List<Header> target) {
        loadHeadersFromResource(R.xml.preference_headers, target);
    }
}

4. 採用 Preference Headers 的好處

我認爲採用此方法有如下優點:
  • 方便同一個應用在不同屏幕大小的設備中進行適配,比如,採用 preference headers 佈局之後,系統設置應用在 phone 和 pad 中的顯示方式分別如下圖所示:



phone 設備分屏佈局



pad 設備分屏佈局


  • 從程序設計的角度,採用 headers 可以降低 preference 佈局文件的耦合度,把原本需要寫在同一個xml文件中的佈局各自獨立開來,各自進行控制和維護而互不影響。
  • 其它優點:望高手賜教。

5. 參考

  • http://developer.android.com/guide/topics/ui/settings.html
  • http://developer.android.com/reference/android/preference/PreferenceActivity.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章