Preferences类
Preferences类作为所有Setting的抽象父类。其每个子类都包括一组属性允许你指定其title(标题)、默认值等。每个子类还提供了其自己的特定的属性和用户界面。一些常用的Preference有:
CheckboxPreference,ListPreference,EditTextPreference
PreferenceActivity
Setting
PreferenceActivity,它并不像普通的Activity那样用layout来做自己的界面,它是用专属的xml/preference.xml来构建自己的界面,然后在类中加入此xml。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<?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信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
class
Setting
extends
PreferenceActivity
implements
OnSharedPreferenceChangeListener {
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);
}
|
用sharedPreference来获得这些值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
@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,
""
));
}
}
}
|
其他场景获取存储内容
private void showSettingInfo() {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
tvCheckout.setText(settings.getBoolean(Consts.CHECKOUT_KEY, false)+"");
tvEditText.setText(settings.getString(Consts.EDIT_KEY, ""));
tvList.setText(settings.getString(Consts.LIST_KEY, "linc"));
}
Preference Fragments
public static class SettingsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
...
}
设置默认值
首先在XML中设置android:defaultValue属性。然后在应用程序启动的第一个Activity中的onCreate()方法中调用:
PreferenceManager.setDefaultValues(this,R.xml.advanced_preferences,false);
Header File
<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:fragment="com.example.prefs.SettingsActivity$SettingsFragmentOne"
android:title="@string/prefs_category_one"
android:summary="@string/prefs_summ_category_one" />
<header
android:fragment="com.example.prefs.SettingsActivity$SettingsFragmentTwo"
android:title="@string/prefs_category_two"
android:summary="@string/prefs_summ_category_two" >
<!-- key/value pairs can be included as arguments for the fragment. -->
<extra android:name="someKey" android:value="someHeaderValue" />
</header>
</preference-headers>
<extra>元素允许你传递键值对Bundle给Fragment,通过getArguments()获得。使用这个Bundle的主要作用是重用相同的PreferenceFragment子类,根据不同的键值对,显示不同的XML文件。
public class SettingsActivity extends PreferenceActivity {
@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.preference_headers, target);
}
}
当使用Preference Headers时,不需要实现onCreate()方法,因为其唯一的任务只是加载Headers
public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {
public static final String KEY_PREF_SYNC_CONN = "pref_syncConnectionType";
...
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(KEY_PREF_SYNC_CONN)) {
Preference connectionPref = findPreference(key);
// Set summary to be the user-description for the selected value
connectionPref.setSummary(sharedPreferences.getString(key, ""));
}
}
}
推荐在onResume时注册,在onPause()时取消注册。
@Override
protected void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}