相信大家對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中添加菜單按鈕及對應效果
- 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;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // TODO Auto-generated method stub
- menu.add(0,menu_setting,1,"設置").setIcon(android.R.drawable.ic_menu_preferences);
- return super.onCreateOptionsMenu(menu);
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- // TODO Auto-generated method stub
- super.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 {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragement()).commit();
- }
- public static class PrefsFragement extends PreferenceFragment{
- @Override
- public void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- addPreferencesFromResource(R.xml.preferences);
- }
- }
- }
最后是運行之后的效果截圖:
大致對PreferenceFragment的學習使用就是這樣啦,以后在高版本上面開發的時候可以考慮這種方式。
文章列表