在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 } } }