在android程序中,記錄用戶的偏好是個能極大提高用戶體驗的功能。Android裏面的Preferences正式爲此事而生。 java
Preferences能夠用來記錄簡單的整數,布爾值,字符串等數據,且在各個Activity之間均能訪問,主要用來實現程序的參數設置功能。最簡單的用法是寫兩行代碼本身建立,以下: android
//從應用的任意處得到Preferences SharedPreferences mPerferences = PreferenceManager .getDefaultSharedPreferences(this); //從Preferences中得到一個值,若是不存在則值爲null String loginName = mPerferences.getInt("name", null); if(loginName == null){ Log.v("Preferences", "User not login"); } //得到Editor編輯Preferences的值 SharedPreferences.Editor mEditor = mPerferences.edit(); mEditor.putInt("name", "admin"); //將更新後的值提交 mEditor.commit();
經過這種方式,應用會在本身的數據文件夾下新建一個名爲shared_prefs的文件夾,並建立一個以應用包名爲名稱的xml文件存放Preferences的值。也就是這些preferences的值不僅是跨activity的,更能在程序下次啓動的時候得到。若是有特別的需求(好比記錄多個用戶的配置信息),還能夠自定義存放Preferences值的文件的名字: app
SharedPreferences mPerferences = PreferenceManager.getSharedPreferences("file-name", 0);
若是應用中設置信息很少,使用上面的方法徹底沒問題。Preferences還有更高級的用法--使用PreferenceActivity 。PreferenceActivity 是專門爲程序的設置界面而設計的一個特殊的activity,配合這個activity的界面xml文件不是在res/layout下,而是res/xml/Preferences.xml。將你要設置的選項按照必定的格式寫在res/xml/Preferences.xml中,並在繼承了PreferenceActivity 的Activity的onCreate函數中加入代碼: ide
addPreferencesFromResource(R.xml.preferences);則程序就會自動生成一個android風格的設置界面。
關於Preferences.xml的格式,這裏有一個複雜的文檔供學習: 函數
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <PreferenceCategory android:title="@string/inline_preferences" > <CheckBoxPreference android:key="checkbox_preference" android:summary="@string/summary_toggle_preference" android:title="@string/title_toggle_preference" /> </PreferenceCategory> <PreferenceCategory android:title="@string/dialog_based_preferences" > <EditTextPreference android:dialogTitle="@string/dialog_title_edittext_preference" android:key="edittext_preference" android:summary="@string/summary_edittext_preference" android:title="@string/title_edittext_preference" /> <ListPreference android:dialogTitle="@string/dialog_title_list_preference" android:entries="@array/entries_list_preference" android:entryValues="@array/entryvalues_list_preference" android:key="list_preference" android:summary="@string/summary_list_preference" android:title="@string/title_list_preference" /> </PreferenceCategory> <PreferenceCategory android:title="@string/launch_preferences" > <PreferenceScreen android:key="screen_preference" android:summary="@string/summary_screen_preference" android:title="@string/title_screen_preference" > <CheckBoxPreference android:key="next_screen_checkbox_preference" android:summary="@string/summary_next_screen_toggle_preference" android:title="@string/title_next_screen_toggle_preference" /> </PreferenceScreen> <PreferenceScreen android:summary="@string/summary_intent_preference" android:title="@string/title_intent_preference" > <intent android:action="android.intent.action.VIEW" android:data="http://www.baidu.com" /> </PreferenceScreen> </PreferenceCategory> <PreferenceCategory android:title="@string/preference_attributes" > <CheckBoxPreference android:key="parent_checkbox_preference" android:summary="@string/summary_parent_preference" android:title="@string/title_parent_preference" /> <CheckBoxPreference android:dependency="parent_checkbox_preference" android:key="child_checkbox_preference" android:layout="?android:attr/preferenceLayoutChild" android:summary="@string/summary_child_preference" android:title="@string/title_child_preference" /> </PreferenceCategory> </PreferenceScreen>
既然Preference能夠用來保存app的配置信息,那麼那些一改變設置就能馬上引起界面或程序改變的效果是怎麼作的呢?答曰:onSharedPreferenceChangeListener。以下。注意,當使用SharedPreferences.Editor改變了一個值後切莫忘記調用commit函數,不然觸發器就會一直觸發。 學習
public class xxxActivity extends Activity implements OnSharedPreferenceChangeListener { // private SharedPreferences prefs; @Override public void onCreate() { // super.onCreate(); this.prefs = PreferenceManager.getDefaultSharedPreferences(this); this.prefs.registerOnSharedPreferenceChangeListener(this); Log.i(TAG, "onCreated"); } public void onSharedPreferenceChanged( SharedPreferences sharedPreferences, String key) { // if(key.equals("****")){ //do someting } } }