部分借鑒:http://blog.csdn.net/flowingflying/article/details/6671548,謝謝作者
步驟1:編寫preference XML,在res/xml/下加入我們的preference XML文件,例如名字叫preference.xml(不是上圖的布局文件)
1 <?xml version="1.0" encoding="utf-8"?> 2 <PreferenceScreen 3 xmlns:android="http://schemas.android.com/apk/res/android"> 4 5 <PreferenceCategory android:title="消息通知"> 6 <CheckBoxPreference android:title="開啟聲音" android:key="開啟聲音" android:summary="當有新消息通知時播放聲音提示" android:defaultValue="true" /> 7 <CheckBoxPreference android:title="開啟震動" android:key="開啟震動" android:summary="當有新消息通知時震動提示" android:defaultValue="true" /> 8 </PreferenceCategory> 9 10 <PreferenceCategory android:title="圖片接收"> 11 <CheckBoxPreference android:title="自動接收圖片" android:key="自動接收圖片" android:summary="GPRS,3G網絡下自動接收並顯示圖片" android:defaultValue="false" /> 12 </PreferenceCategory> 13 14 <PreferenceCategory android:title="顯示" > 15 <CheckBoxPreference android:title="開啟橫屏模式" android:key="開啟橫屏模式" android:defaultValue="true" /> 16 <CheckBoxPreference android:title="顯示系統欄掛機圖標" android:key="顯示系統欄掛機圖標" android:summary="后台運行時,在系統欄顯示程序圖標" android:defaultValue="true" /> 17 <PreferenceScreen android:title="更換皮膚"> 18 <intent android:targetPackage="com.genius.demo" android:targetClass="com.genius.demo.SkinActivity" /> 19 </PreferenceScreen> 20 </PreferenceCategory> 21 22 <PreferenceCategory android:title="輔助功能"> 23 <CheckBoxPreference android:title="開啟截屏功能" android:key="開啟截屏功能" android:summary="搖晃手機即可截圖(在QQ外截圖需root權限)" android:defaultValue="false" /> 24 <CheckBoxPreference android:title="上報我的地理位置" android:key="上報我的地理位置" android:summary="上報地理位置信息以便附近的人能夠找到我" android:defaultValue="false" /> 25 <PreferenceScreen android:title="查看流量統計" android:summary="使用手機QQ所產生的上行和下行流量"> 26 <intent android:targetPackage="com.genius.demo" android:targetClass="com.genius.demo.TrafficStatActivity" /> 27 </PreferenceScreen> 28 29 </PreferenceCategory> 30 31 <PreferenceCategory android:title="幫助"> 32 <PreferenceScreen android:title="反饋建議" android:summary="反饋建議"> 33 <intent android:action="android.intent.action.VIEW" android:data="http://wap.3g.qq.com/g/s?aid=wapsupport&amp;fid=647" /> 34 </PreferenceScreen> 35 <PreferenceScreen android:title="好友設置" android:summary="好友設置"> 36 <intent android:targetPackage="com.genius.demo" android:targetClass="com.genius.demo.FriendInfoActivity" /> 37 </PreferenceScreen> 38 </PreferenceCategory> 39 </PreferenceScreen>
步驟2:在java源代碼中調用該xml,生成相應的preference界面,同時可設置對應的監聽操作,例如分享、自動加載更多等
1 package com.maomao.beautymovie; 2 3 4 5 import android.app.ActionBar; 6 import android.content.Intent; 7 import android.os.Bundle; 8 import android.preference.CheckBoxPreference; 9 import android.preference.Preference; 10 import android.preference.Preference.OnPreferenceChangeListener; 11 import android.preference.Preference.OnPreferenceClickListener; 12 import android.preference.PreferenceActivity; 13 import android.view.MenuItem; 14 import android.widget.Toast; 15 16 public class SettingActivity extends PreferenceActivity implements OnPreferenceClickListener,OnPreferenceChangeListener{ 17 18 protected ActionBar mActionBar; 19 private Preference pref_share; 20 private CheckBoxPreference autoLoad_cbox; 21 @SuppressWarnings("deprecation") 22 protected void onCreate(Bundle savedInstanceState) { 23 super.onCreate(savedInstanceState); 24 25 // Load the preferences from an XML resource 26 27 28 initActionBar(); 29 addPreferencesFromResource(R.xml.setting_preference); 30 31 autoLoad_cbox = (CheckBoxPreference) findPreference("autoload"); 32 /** 33 * Preference分享操作 34 */ 35 pref_share=(Preference) findPreference("pref_share"); 36 pref_share.setOnPreferenceClickListener(this); 37 autoLoad_cbox.setOnPreferenceChangeListener(this); 38 39 40 } 41 42 43 44 private void initActionBar() { 45 mActionBar = getActionBar(); 46 mActionBar.setDisplayHomeAsUpEnabled(true); // 給左上角圖標的左邊加上一個返回的圖標"《" 。對應ActionBar.DISPLAY_HOME_AS_UP 47 mActionBar.setDisplayShowHomeEnabled(true); //使左上角圖標可點擊,對應id為android.R.id.home,對應ActionBar.DISPLAY_SHOW_HOME false 則圖標無法點擊 48 mActionBar.setHomeButtonEnabled(true); // false 就無法點擊 49 } 50 51 @Override 52 public boolean onOptionsItemSelected(MenuItem item) { 53 if (item.getItemId() == android.R.id.home) { 54 finish(); 55 return true; 56 } 57 return super.onOptionsItemSelected(item); 58 } 59 60 61 62 // 63 // mCheckbox0.setOnPreferenceClickListener(new OnPreferenceClickListener() { 64 // @Override 65 // public boolean onPreferenceClick(Preference preference) { 66 // //這里可以監聽到這個CheckBox 的點擊事件 67 // return true; 68 // } 69 // }); 70 // mCheckbox0.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 71 // @Override 72 // public boolean onPreferenceChange(Preference arg0, Object newValue) { 73 // //這里可以監聽到checkBox中值是否改變了 74 // //並且可以拿到新改變的值 75 // Toast.makeText(mContext, "checkBox_0改變的值為" + (Boolean)newValue, Toast.LENGTH_LONG).show(); 76 // return true; 77 // } 78 // }); 79 // 80 81 82 83 84 /** 85 * on share item click 86 */ 87 public void onClickShare() { 88 Intent intent = new Intent(Intent.ACTION_SEND); 89 intent.setType("text/plain"); 90 intent.putExtra(Intent.EXTRA_SUBJECT, "分享"); 91 intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.share_text)); 92 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 93 startActivity(Intent.createChooser(intent, getTitle())); 94 } 95 96 @Override 97 public boolean onPreferenceClick(Preference preference) { 98 // TODO Auto-generated method stub 99 if(preference == pref_share){ 100 onClickShare(); 101 return true; 102 } 103 return false; 104 } 105 106 107 108 @Override 109 public boolean onPreferenceChange(Preference preference, Object newValue) { 110 if(preference == autoLoad_cbox){ 111 //這里可以監聽到checkBox中值是否改變了 112 //並且可以拿到新改變的值 113 Toast.makeText(this, "自動加載更多:" + (Boolean)newValue, Toast.LENGTH_SHORT).show(); 114 return true; 115 } 116 return false; 117 } 118 119 120 121 }
和用layout方式一樣,代碼很簡單。和以往界面最大的區別是,我們對checkbox進行選擇或者對ringtone進行選擇后,這個選擇結果是被保留的,當我們退出actitvity后再次進入,上次的選項依然保留,我們重新向模擬器load應用,發現之前的選項仍然存在。我們可以利用preference,而無須人工對數據進行保存和讀取,很是方便。
步驟3:獲取preference的數據
處了在preference的界面中可以保留數據,我們也希望能夠讀出數據,以便這些數據可以用在其他的activity中。如果另一個activity和這些數據關聯,而且希望能夠實時進行同步,在onResume()中對preference保留的數據進行讀取,而后進行相關的更新。
首先要獲取preferences,然后通過鍵值對的獲取方式根據key獲取數值,在xml中checkbox的key為“checkbox”,值的類型為布爾值,而rintong的值為String,例如:
1 protected void onResume() { //在另一個Activity中 2 super.onResume(); 3 SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ; 4 System.out.println(new Boolean(prefs.getBoolean("checkbox",false)).toString());//false表示沒有查到checkbox這個key的返回值 5 System.out.println(prefs.getString("ringtone","<unset>"));//<unset>表示沒有查到ringtong這個key的返回值 6 }
or:
1 @Override 2 public void onResume() { 3 SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(getActivity()); 4 movieListView.setAutoLoadMore(prefs.getBoolean("autoload",false)); 5 super.onResume(); 6 }
PreferenceCategory也可以嵌套PreferenceScreen,PreferenceScreen中的內容,將通過另一屏來顯示,我們在上面例子后面添加一個嵌套了PreferenceScreen的PreferenceCategory。整個PreferenceScreen作為一個組件出現,點擊后新的一屏,由入PreferenceScreen定義。通過這個關系,我們可以組織自己的preference架構。
1 <?xml version="1.0" encoding="utf-8"?> 2 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 3 <PreferenceCategory android:title="Simple Preferences"> 4 <CheckBoxPreference android:key="checkbox" ..../> 5 <RingtonePreference android:key="ringtone" ... /> 6 </PreferenceCategory> 7 <PreferenceCategory android:title="Detail Screens"> 8 <PreferenceScreen android:title="Detail" 9 android:summary="Addtional preference help in another page"> 10 <CheckBoxPreference android:key="checkbox2" 11 android:title="Another Checkbox" 12 android:summary="On or Off, It's a problem...."/> 13 </PreferenceScreen> 14 </PreferenceCategory> 15 </PreferenceScreen>