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);
}