文章出處

  相信大家對Perference都比較熟悉了,也就是我們常說的偏好設置,首選項設置,可以保存一些數據,例如我們在上一次使用的時候的一些內容,希望在下一次啟動后依然生效,而不需要再進行配置那么麻煩。一般這個時候我們便會使用perference鍵值對的方式來處理,在android3.0之前,我們一般去繼承Preference這個基類去給用戶呈現一個可以設置的界面,其中的layout需要自己編寫,今天我們研究的是3.0之后使用碎片技術的首選項配置方法,即使用PreferenceFragement來實現。

 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

public abstract class PreferenceFragment extends Fragment

以一個列表來展示首選項對象的層級關系,這些首選項將自動地保存為SharedPreferences,使用戶可以用他們來進行交互。為了能夠重新獲得ShaedPreferences的實例,該Fragement中的層級首選項將會在同一個包下面使用帶有一個上下文的PreferenceManager.getDefaultSharedPreferences作為這個fragement 。

此外,所展示的首選項將會遵循系統首選項的視覺風格,通過使用XML文件來創建各個首選項的視圖層級(可以被顯示在許多頁面)會非常簡單。基于上述原因,推薦在應用中使用這個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差不多,步驟如下:

①創建一個工程

②在MainAcitivity中添加菜單按鈕及對應效果

[java] view plaincopy
 
  1. package com.example.fragementexam;  
  2.   
  3. import android.os.Bundle;  
  4. import android.view.Menu;  
  5. import android.view.MenuItem;  
  6. import android.app.Activity;  
  7. import android.content.Intent;  
  8.   
  9. public class MainActivity extends Activity {  
  10.       
  11.     private static final int menu_setting = 1;  
  12.   
  13.     @Override  
  14.     protected void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.main);  
  17.     }  
  18.       
  19.     @Override  
  20.     public boolean onCreateOptionsMenu(Menu menu) {  
  21.         // TODO Auto-generated method stub  
  22.         menu.add(0,menu_setting,1,"設置").setIcon(android.R.drawable.ic_menu_preferences);  
  23.         return super.onCreateOptionsMenu(menu);  
  24.     }  
  25.       
  26.     @Override  
  27.     public boolean onOptionsItemSelected(MenuItem item) {  
  28.         // TODO Auto-generated method stub  
  29.         super.onOptionsItemSelected(item);  
  30.         Intent intent = new Intent(this, FragmentPreferences.class);  
  31.         startActivity(intent);  
  32.         return false;  
  33.     }  
  34.   
  35. }  

 

③在res文件夾下面新建一個xml文件夾,在里面新建一個preferences.xml文件

[html] view plaincopy
 
  1. <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >  
  2.   
  3.     <PreferenceCategory android:title="In-line preferences" >  
  4.         <CheckBoxPreference  
  5.             android:key="checkbox_preference"  
  6.             android:summary="這是一個復選框"  
  7.             android:title="復選框設置" />  
  8.     </PreferenceCategory>  
  9.     <PreferenceCategory android:title="Dialog-based preferences" >  
  10.         <EditTextPreference  
  11.             android:dialogTitle="請輸入你最喜歡的種族"  
  12.             android:key="edittext_preference"  
  13.             android:summary="一個使用了編輯文本對話框的例子"  
  14.             android:title="請輸入你最喜歡的種族" />  
  15.   
  16.         <ListPreference  
  17.             android:dialogTitle="請選擇一項"  
  18.             android:entries="@array/entries_list_preference"  
  19.             android:entryValues="@array/entryvalues_list_preference"  
  20.             android:key="list_preferenc"  
  21.             android:summary="一個使用了列表對話框的例子"  
  22.             android:title="請選擇一項" />  
  23.     </PreferenceCategory>  
  24.     <PreferenceCategory android:title="Launch preferences" >   
  25.         <!-- 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. -->  
  26.         <PreferenceScreen  
  27.             android:key="screen_preference"  
  28.             android:summary="展示另一個首選項配置頁面"  
  29.             android:title="頁面首選項" >   
  30.             <!-- 你可以在這里放置更多的首選項內容,將被在下一個頁面呈現出來 -->  
  31.             <CheckBoxPreference  
  32.                 android:key="next_screen_checkbox_preference"  
  33.                 android:summary="在另一個頁面展示但出于同一個層級的首選項配置"  
  34.                 android:title="復選框設置" />  
  35.         </PreferenceScreen>  
  36.         <PreferenceScreen  
  37.             android:summary="從一個意圖中啟動一個activity"  
  38.             android:title="意圖首選項" >  
  39.             <intent  
  40.                 android:action="android.intent.action.VIEW"  
  41.                 android:data="http://www.baidu.com" />  
  42.         </PreferenceScreen>  
  43.     </PreferenceCategory>  
  44.     <PreferenceCategory android:title="Preference attributes" >  
  45.         <CheckBoxPreference  
  46.             android:key="parent_checkbox_preference"  
  47.             android:summary="這是一個可見的父類"  
  48.             android:title="父類復選框首選項" />  
  49.         <!-- 子類的可見類型是由樣式屬性定義的 -->  
  50.         <CheckBoxPreference  
  51.             android:dependency="parent_checkbox_preference"  
  52.             android:key="child_checkbox_preference"  
  53.             android:layout="?android:attr/preferenceLayoutChild"  
  54.             android:summary="這是一個可見的子類"  
  55.             android:title="子類復選框首選項" />  
  56.     </PreferenceCategory>  
  57.   
  58. </PreferenceScreen>  

 

④FragmentPreferences.java的代碼部分

[java] view plaincopy
 
  1. package com.example.fragementexam;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.preference.PreferenceFragment;  
  6.   
  7. public class FragmentPreferences extends Activity {  
  8.     @Override  
  9.     protected void onCreate(Bundle savedInstanceState) {  
  10.         // TODO Auto-generated method stub  
  11.         super.onCreate(savedInstanceState);  
  12.         getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragement()).commit();  
  13.     }  
  14.       
  15.       
  16.     public static class PrefsFragement extends PreferenceFragment{  
  17.         @Override  
  18.         public void onCreate(Bundle savedInstanceState) {  
  19.             // TODO Auto-generated method stub  
  20.             super.onCreate(savedInstanceState);  
  21.             addPreferencesFromResource(R.xml.preferences);  
  22.         }  
  23.     }  
  24. }  


最后是運行之后的效果截圖:

 

                        

 

大致對PreferenceFragment的學習使用就是這樣啦,以后在高版本上面開發的時候可以考慮這種方式。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()