android設定中常用的PreferenceActivity用法介紹

來源:互聯網
上載者:User

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>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.