android_PreferenceActivity_PreferenceFragment

Preferences类

    Preferences类作为所有Setting的抽象父类。其每个子类都包括一组属性允许你指定其title(标题)、默认值等。每个子类还提供了其自己的特定的属性和用户界面。一些常用的Preference有:

CheckboxPreference,ListPreference,EditTextPreference

PreferenceActivity
Setting

    PreferenceActivity,它并不像普通的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 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来获得这些值。

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

}


你可能感兴趣的:(android_PreferenceActivity_PreferenceFragment)