Android之PreferenceActivity和SharedPreferneces
1.SharedPreferneces
android.content.SharedPreferences接口,用来获取和修改数据。有三种获取系统中保存的持久化数据的方式:
1). public SharedPreferences getPreferences (int mode):通过Activity对象获取,获取的是本Activity私有的Preference,保存在系统中的xml形式的文件的名称为这个Activity的名字,因此一个Activity只能有一个,属于这个Activity。
2). public SharedPreferences getSharedPreferences (String name, int mode):因为Activity继承了ContextWrapper,因此也是通过Activity对象获取,但是属于整个应用程序,可以有多个,以第一参数“name”为文件名保存在系统中。
3). public static SharedPreferences getDefaultSharedPreferences (Context context):PreferenceManager的静态函数,保存PreferenceActivity中的设置,属于整个应用程序,只有一个,Android会根据包名和PreferenceActivity的布局文件来起一个名字保存。
通过以上方式取得SharedPreferences后就可以对数据进行读取或者保存了。
String STORE_NAME = "Settings";
SharedPreferences settings = getSharedPreferences(STORE_NAME, MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putInt("sourceType", 0);
editor.commit();
获得SharedPreferences,如果需要进行保存等修改操作,首先得通过其edit()方法获得SharedPreferences.Editor,然后就可以通过putInt、putString等方法以键值对(key-value)的方式保存数据,或者remove移除某个键(key),及调用clear方法删除所有内容。最后需要调用commit方法是使修改生效。读取可以通过getInt、getString等方法获取对应键(key)保存着的数据,如果没有找到key,则返回第二个参数作为默认值。
2、PreferencesActivity
PreferencesActivity是Android中专门用来实现程序设置界面及参数存储的一个Activity。
它并不像普通的Activity那样用layout来做自己的界面,它是用专属的xml/preference.xml来构建自己的界面,然后在类中加入此xml。
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory android:title="First Category">
<ListPreference
android:key="list_key"
android:defaultValue="list key default value"
android:title="list title"
android:summary="list_summary"
android:entries="@array/list_preference"
android:entryValues="@array/list_preference"
android:dialogTitle="list_dialog_title" />
</PreferenceCategory>
<PreferenceCategory android:title="Second Category">
<EditTextPreference
android:key="edittext_key"
android:defaultValue="edit default value"
android:summary="edit summary"
android:title="edit title" />
<CheckBoxPreference
android:key="checkbox_key"
android:defaultValue="checkbox default value"
android:summary="checkbox summary"
android:title="checkbox title"
/>
<EditTextPreference
android:key="num_key"
android:defaultValue="0"
android:summary="edit summary"
android:numeric="integer"
android:title="input number" />
</PreferenceCategory></PreferenceScreen>
三项preference分成两组(PreferenceCategory),First Category和Second Category.
每一个Preference中的都会包含一个key(android:key),它的功能相当于普通layout中的id。
title:这一项的标题,字体比较大。
summary:摘要,标题下面的文字,字体较小。
defaultValue:为设置summary之前的默认值。
其中数组list_preference在array.xml中定义:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="list_preference">
<item>Red</item>
<item>Blue</item>
<item>Green</item>
</string-array>
</resources>
Setting中是怎样加入这些UI信息呢?
public class Setting extends PreferenceActivity <span style="margin: 0px; padding: 0px; border: none; font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px;"> </span><span class="keyword" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 102, 153); font-weight: bold; font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px;">implements</span><span style="margin: 0px; padding: 0px; border: none; font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px;"> OnSharedPreferenceChangeListener</span>{
private EditTextPreference mEtPreference;
private ListPreference mListPreference;
private CheckBoxPreference mCheckPreference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
initPreferences();
}
private void initPreferences() {
mEtPreference = (EditTextPreference)findPreference(Consts.EDIT_KEY);
mListPreference = (ListPreference)findPreference(Consts.LIST_KEY);
mCheckPreference = (CheckBoxPreference)findPreference(Consts.CHECKOUT_KEY);
}
我们设置了自己的偏好值,程序中如何获得呢?
@Override
protected void onResume() {
super.onResume();
// Setup the initial values
SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences();
mListPreference.setSummary(sharedPreferences.getString(Consts.LIST_KEY, ""));
mEtPreference.setSummary(sharedPreferences.getString(Consts.EDIT_KEY, "linc"));
// Set up a listener whenever a key changes
sharedPreferences.registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
// Unregister the listener whenever a key changes
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(Consts.EDIT_KEY)) {
mEtPreference.setSummary(
sharedPreferences.getString(key, "20"));
} else if(key.equals(Consts.LIST_KEY)) {
mListPreference.setSummary(sharedPreferences.getString(key, ""));
}
}
那么,在其他Activity中如何获得设置的值呢?也是用sharedPreference来实现呢?
private void showSettingInfo() {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
settings.getBoolean(Consts.CHECKOUT_KEY, false);
settings.getString(Consts.EDIT_KEY, "");
settings.getString(Consts.LIST_KEY, "linc");
}
引用:
http://blog.csdn.net/lincyang/article/details/20609673
http://blog.csdn.net/joebaby_/article/details/7971823