android_PreferenceActivity_PreferenceFragment

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

}


發佈了33 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章