在android程序中,记录用户的偏好是个能极大提升用户体验的功能。Android里面的Preferences正式为此事而生。
Preferences可以用来记录简单的整数,布尔值,字符串等数据,且在各个Activity之间均能访问,主要用来实现程序的参数设置功能。最简单的用法是写两行代码自己创建,如下:
//从应用的任意处获得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值的文件的名字:
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函数中加入代码:
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
}
}
}
来源:oschina
链接:https://my.oschina.net/u/267094/blog/166978