標籤:
我相信每個人都Perference大家都比較熟悉,這就是我們常說的偏好,喜好設定設定,一些資料可以儲存。例如,一些元件的,我們使用上次。希望下次啟動後仍然生效,煩。一般這個時候我們便會使用perference鍵值對的方式來處理,在android3.0之前,我們一般去繼承Preference這個基類去給使用者呈現一個能夠設定的介面。當中的layout須要自己編寫,今天我們研究的是3.0之後使用片段技術的喜好設定配置方法,即使用PreferenceFragement來實現。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
public abstract class PreferenceFragment extends Fragment
以一個列表來展示喜好設定對象的層級關係。這些喜好設定將自己主動地儲存為SharedPreferences。使使用者可以用他們來進行互動。
為了可以又一次獲得ShaedPreferences的執行個體,該Fragement中的層級喜好設定將會在同一個包以下使用帶有一個內容相關的PreferenceManager.getDefaultSharedPreferences作為這個fragement 。
此外。所展示的喜好設定將會遵循系統喜好設定的視覺風格。通過使用XML檔案來建立各個喜好設定的視圖層級(能夠被顯示在很多頁面)會很easy。基於上述原因,推薦在應用中使用這個fragement(作為一個超類)來處理喜好設定問題。
一個PreferenceScreen對象應該在喜好設定層級的頂部。此外,隨後在階層PreferenceScreen表示一個螢幕切割處——就是包括隨後的PreferenceScreen應顯示在還有一個螢幕頁面上。喜好設定架構處理從喜好設定階層顯示了這些其它螢幕內容。
喜好設定階層能夠有非常多種方式形成:
●從一個XML檔案制定的階層。
●從不同的activity,每個activity通過meta-data在一個XML檔案裡制定他自己的喜好設定。
●從一個以PreferenceScreen為根的階層對象。
為了從一個XML檔案裡擷取介面,使用addPreferenceFromResource(int)方法。根項目應該使用PreferenceScreen。隨後的元素能夠指向實際的喜好設定的子類。正如上面提到的,在階層中隨後的PreferenceScreen將導致螢幕切割處。
為了指定一個意圖來查詢都帶有各自喜好設定的activitiy,使用addPreferenceFromIntent方法。
每一個activity能夠在manifest檔案裡指定meta-data來指向一個XML檔案資源。這些資源檔將被填充到單獨的喜好設定階層而且通過這個fragment來展示。
為了指定一個以PreferenceScreen為根項目的對象。使用setPreferenceScreen(PreferenceScreen)方法。
方便起見。這個fragment實現了一個用於當前階層中隨意喜好設定的點擊事件監聽器。onPreferenceTreeClick(PreferenceScreen,Preference).
以上翻譯自PreferenceFragment的官方文檔,可自行查閱其原版說明
----------------------------------------------------------------------------------------------------------------------------------------
依據官方文檔的說明以及內建的APIdemo中的範例,我自己使用PreferenceFragment寫了一個範例,效果與之前使用繼承PreferenceActivity差點兒相同,過程例如以下:
①建立一個project
②在MainAcitivity中加入菜單button及相應效果
package com.example.fragementexam;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.app.Activity;import android.content.Intent;public class MainActivity extends Activity {private static final int menu_setting = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// TODO Auto-generated method stubmenu.add(0,menu_setting,1,"設定").setIcon(android.R.drawable.ic_menu_preferences);return super.onCreateOptionsMenu(menu);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// TODO Auto-generated method stubsuper.onOptionsItemSelected(item);Intent intent = new Intent(this, FragmentPreferences.class);startActivity(intent);return false;}}
③在res目錄以下建立一個xml目錄,在裡面建立一個preferences.xml檔案
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <PreferenceCategory android:title="In-line preferences" > <CheckBoxPreference android:key="checkbox_preference" android:summary="這是一個複選框" android:title="複選框設定" /> </PreferenceCategory> <PreferenceCategory android:title="Dialog-based preferences" > <EditTextPreference android:dialogTitle="請輸入你最喜歡的種族" android:key="edittext_preference" android:summary="一個使用了編輯文本對話方塊的範例" android:title="請輸入你最喜歡的種族" /> <ListPreference android:dialogTitle="請選擇一項" android:entries="@array/entries_list_preference" android:entryValues="@array/entryvalues_list_preference" android:key="list_preferenc" android:summary="一個使用了列表對話方塊的範例" android:title="請選擇一項" /> </PreferenceCategory> <PreferenceCategory android:title="Launch preferences" > <!-- This PreferenceScreen tag serves as a screen break (similar to page break in word processing). Like for other preference types, we assign a key here so it is able to save and restore its instance state. --> <PreferenceScreen android:key="screen_preference" android:summary="展示還有一個喜好設定配置頁面" android:title="頁面喜好設定" > <!-- 你能夠在這裡放置很多其它的喜好設定內容,將被在下一個頁面呈現出來 --> <CheckBoxPreference android:key="next_screen_checkbox_preference" android:summary="在還有一個頁面展示但出於同一個層級的喜好設定配置" android:title="複選框設定" /> </PreferenceScreen> <PreferenceScreen android:summary="從一個意圖中啟動一個activity" android:title="意圖喜好設定" > <intent android:action="android.intent.action.VIEW" android:data="http://www.baidu.com" /> </PreferenceScreen> </PreferenceCategory> <PreferenceCategory android:title="Preference attributes" > <CheckBoxPreference android:key="parent_checkbox_preference" android:summary="這是一個可見的父類" android:title="父類複選框喜好設定" /> <!-- 子類的可見類型是由樣式屬性定義的 --> <CheckBoxPreference android:dependency="parent_checkbox_preference" android:key="child_checkbox_preference" android:layout="?android:attr/preferenceLayoutChild" android:summary="這是一個可見的子類" android:title="子類複選框喜好設定" /> </PreferenceCategory></PreferenceScreen>
④FragmentPreferences.java的代碼部分
package com.example.fragementexam;import android.app.Activity;import android.os.Bundle;import android.preference.PreferenceFragment;public class FragmentPreferences extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragement()).commit();}public static class PrefsFragement extends PreferenceFragment{@Overridepublic void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);addPreferencesFromResource(R.xml.preferences);}}}
最後是執行之後的效果:
大約在PreferenceFragment學習使用它是如此,後來在高版本號碼高於開發這樣一種方式,當考慮。
Android Fragement學習筆記(三)----PreferenceFragment使用