PreferenceActivity它包含了許多類似控制項的東西來表示不同的設定需求如分類設定,選擇框設定,下拉式清單設定,編輯框設定,鈴聲設定,而且這些設定不需要我們自己來儲存使用者佈建的資料,它自己會將資料儲存在xml檔案當中。下面是PreferenceActivity中各個組件的介紹。
1. PreferenceScreen:設定頁面,可嵌套形成二級設定頁面,用Title參數設定標題。
Preferencescreen中啟動activity
例如wireless_setting.xml中有如下片段
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"xmlns:settings="http://schemas.android.com/apk/res/com.seedshope.android"> <PreferenceScreen android:key="wifi_settings" android:title="@string/wifi_settings" android:summary="@string/wifi_settings_summary" > <intent android:action="android.intent.action.MAIN" android:targetPackage="com.android.settings" android:targetClass="com.android.settings.wifi.WifiSettings" /> </PreferenceScreen></PreferenceScreen>
其中com.android.settings是工程的包名,com.android.settings.wifi.WifiSettings是要啟動的類。
一般情況下,這樣就ok了,點擊對應的Preference就能夠啟動對應的activity,然而僅僅這樣有時這樣,並不一定能夠啟動對應的activity,因為它與回呼函數onPreferenceTreeClick有關,有時候我們會重寫這個方法如:
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if ( (preference == mAirplaneModePreference) && (Boolean.parseBoolean( SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) ) { // In ECM mode launch ECM app dialog startActivityForResult( new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null), REQUEST_CODE_EXIT_ECM); return true; } else { // Let the intents be launched by the Preference manager return false; } }
其中WirelessSetting.java中有如上函數,當傳回值為true時,你怎麼點擊Preference都不會跳轉到activity的,只有等到它的傳回值為false的時候,才可以正常跳轉,因為點擊某一個Preference的真正實現在Preference.java的performClick函數中如下:
void performClick(PreferenceScreen preferenceScreen) { if (!isEnabled()) { return; } onClick(); if (mOnClickListener != null && mOnClickListener.onPreferenceClick(this)) { return; } PreferenceManager preferenceManager = getPreferenceManager(); if (preferenceManager != null) { PreferenceManager.OnPreferenceTreeClickListener listener = preferenceManager .getOnPreferenceTreeClickListener(); if (preferenceScreen != null && listener != null && listener.onPreferenceTreeClick(preferenceScreen, this)) { return; } } if (mIntent != null) { Context context = getContext(); context.startActivity(mIntent); } }
當點擊某個Preference時的調用流程是AdapterView.performItemClick--》PreferenceScreen.onItemClick--》Preference.performClick--》PreferenceActivity.onPreferenceTreeClick,當onPreferenceTreeClick返回true的時候就直接return了,沒有走下面啟動activity的地方了,因此要使一個Preference能夠正常跳轉到另外一個activity有兩個條件,一是xml裡面是否設定正確,第二是調用該xml的java類是否在onPreferenceTreeClick這個函數需要返回false。
2. PreferenceCategory:某一類相關的設定,可用Title參數設定標題,相當於一個分界線的東西一樣,它的上面和下面分別屬於不同類型的設定。
3. CheckBoxPreference:是一個CheckBox設定,只有兩種值,true或false,可用Title參數設定標題,用summaryOn和summaryOff參數來設定控制項選中和未選中時的提示,可以用defaultValue設定預設值。
4. ListPreference:下拉框選擇控制項,用Title參數設定標題,用Summary參數設定說明,點擊後出現下拉框,用dialogTitle設定下拉框的標題,下拉框內顯示的內容和具體的值需要在res/values/array.xml中設定兩個array來表示,entries和entryValues分別表示顯示的值和代碼中擷取的真正的值。例如array.xml設定如下:
<?xml version ="1.0" encoding ="utf-8" ?><resources><string-array name ="entries_list_preference" > <item> test1</item> <item> test2</item> <item> test3</item></string-array><string-array name ="entriesvalue_list_preference" > <item> 1</item> <item> 2</item> <item> 3</item></string-array></resources>
5. EditTextPreference:輸入框控制項,點擊後可輸入字串設定。用Title參數設定標題,Summary參數設定說明,dialogTitle參數設定輸入框的標題。
6. RingtonePreference:鈴聲選擇框,點擊後可選擇系統鈴聲。Title參數設定標題,Summary參數設定說明,dialogTitle參數設定鈴聲選擇框的標題。
7. 以上是PreferenceActivity的xml描述,那麼在程式中我們只需要建立一個繼承自PreferenceActivity的 Activity,然後在主程式中調用就可以了。這個PreferenceActivity中的設定儲存是完全自動的,你不需要再用代碼去實現設定的儲存,PreferenceActivity建立後會自動建立一個設定檔/data/data/your_package_name
/shared_prefs/(your_package_name)_preferences.xml。自動產生的設定檔如下:
<?xml version ='1.0' encoding ='utf-8' standalone ='yes' ?><map><string name ="EditTextPreference" >12332312</string><string name ="ListPreference" >2</string><string name ="RingtonePreference" >content://media/internal/audio/media/10</string><boolean name ="CheckBox1" value ="true" /><boolean name ="CheckBox2" value ="true" /></map>
檔案中的name屬性對應xml檔案中的key屬性工作表示某一個設定項,值是唯一的,value以及string中間的值表示設定項的具體值。
以下為AdwLauncher的一些配置:
<PreferenceScreenandroid:key="screenPreferences"android:title="@string/pref_title_screen_preferences"android:summary="@string/pref_summary_screen_preferences"><CheckBoxPreference android:title="@string/pref_title_hide_statusbar"android:defaultValue="false"android:summary="@string/pref_summary_hide_statusbar"android:key="hideStatusbar" /><CheckBoxPreference android:title="@string/pref_title_wallpaper_scrolling"android:defaultValue="@bool/config_wallpaper_scroll"android:summary="@string/pref_summary_wallpaper_scrolling"android:key="wallpaper_scrolling" /><PreferenceCategoryandroid:title="@string/pref_title_screens_layout_preferencecategory"><CheckBoxPreference android:key="uiHideLabels"android:title="@string/pref_title_hide_icon_labels"android:summary="@string/pref_summary_hide_icon_labels"android:defaultValue="false" /><CheckBoxPreference android:title="@string/pref_title_autosize_icons"android:defaultValue="false"android:summary="@string/pref_summary_autosize_icons"android:key="autosizeIcons" /><com.android.launcher.DialogSeekBarPreferenceandroid:title="@string/pref_title_desktop_columns"android:summary="@string/pref_summary_desktop_columns"android:dialogMessage="@string/pref_dialog_desktop_columns"android:key="desktopColumns" android:defaultValue="@integer/config_desktopColumns"android:max="5" /><com.android.launcher.DialogSeekBarPreferenceandroid:title="@string/pref_title_desktop_rows"android:summary="@string/pref_summary_desktop_rows"android:dialogMessage="@string/pref_dialog_desktop_rows"android:key="desktopRows" android:defaultValue="@integer/config_desktopRows"android:max="5" /></PreferenceCategory><PreferenceCategory android:title="@string/pref_title_screens_behaviour_preferencecategory"><com.android.launcher.DialogSeekBarPreferenceandroid:title="@string/pref_title_desktop_scrolling_speed"android:summary="@string/pref_summary_desktop_scrolling_speed"android:dialogMessage="@string/pref_dialog_desktop_scrolling_speed"android:key="desktopSpeed" android:defaultValue="@integer/config_desktopSpeed"android:max="2000" /><com.android.launcher.DialogSeekBarPreferenceandroid:title="@string/pref_title_desktop_overshoot"android:summary="@string/pref_summary_desktop_overshoot"android:dialogMessage="@string/pref_dialog_desktop_overshoot"android:key="desktopBounce" android:defaultValue="@integer/config_desktopBounce"android:max="100" /></PreferenceCategory></PreferenceScreen>