1. 問題提出:如何處理需要分屏分組的設置項?
- Android 3.0之前:採用PreferenceScreen嵌套的方法;
- Android 3.0及之後:採用Preference Headers的方法。
2. 採用 PreferenceScreen 嵌套
<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>
3. 採用 Preference Headers
<?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 中的顯示方式分別如下圖所示:
- 從程序設計的角度,採用 headers 可以降低 preference 佈局文件的耦合度,把原本需要寫在同一個xml文件中的佈局各自獨立開來,各自進行控制和維護而互不影響。
- 其它優點:望高手賜教。
5. 參考
- http://developer.android.com/guide/topics/ui/settings.html
- http://developer.android.com/reference/android/preference/PreferenceActivity.html