Preference 使用详解

和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点:
一、Preference 简介
二、Preference 使用方法
三、使用XML定义Preference
四、使用Fragment 定义Preference
五、实现效果如下:
一、Preference 简介
Preference 在Android 中重要的控件之一,比如 Settings 模块大部分都是通过Preference 实现的,本章将研究preference 使用方法
1.Preference 继承关系
java.lang.Object
    ↳ android.preference.Preference
Preference 常用于APP设置模块,比如Android 系统中的Settings 模块,它可以默认把我们的数据保存在SharePreference中。

settings中常用Preference 举例
2.键值对(key-values) 获取方法同 SharePreference
        SharedPreferences   mSp = PreferenceManager.getDefaultSharedPreferences(this);
        String favPhone = mSp.getString(PREF_LISTPHONE, "MI");
3.Preference 数据保存
Preference通过key-values 键值对的形式保存。
保存路径如下:/data/data/包名/shared_prefs/包名_preferences.xml

Preference 数据保存路径
二、 Preference 使用方法
一般在XML文件夹中创建xml文件来对Settings进行布局,布局文件中通常使用PreferenceScreen容器,PreferenceScreen包含多个 Preference控件,PreferenceCategory可以设置分类标题。
1.常用Preference控件如下:
PreferenceScreenCheckBoxPreferenceEditTextPreferenceListPreferencePreferenceCategoryRingtonePreference.
上面控件等同Layout布局中的View,PreferenceScreen 等同Layout布局中的ViewGroup。在Android 3.0之前需要继承PreferenceActivity(此方法不是太推荐使用,已被启用),3.0之后更高版本,则需要继承Activity,使用Fragment控制布局,然后实现不同控件的处理事件。
2.Perference常用使用方法如下两种:
1.使用XML定义
Preference2.使用
Fragment定义Preference
三、使用XML定义Preference
此方法有点过时,不太建议使用,但目前还可以用。
其使用方法如下:
将
XML文件保存在res/xml/目录中 例如:preferences.xml继承
PreferenceActivity在onCreate方法中直接调用addPreferencesFromResource(R.xml.preference);添加布局点击事件处理
setOnPreferenceClickListener,内容发生改变事件处理setOnPreferenceChangeListener
Preference使用案例如下:res /xml /preferences.xml
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <Preference
        android:key="about_phone"
        android:summary="@string/pref_about_phone_sum"
        android:title="@string/pref_about_phone_tittle" />
    <SwitchPreference
        android:key="sw_perference"
        android:summary="@string/pref_about_phone_sum"
        android:title="@string/pref_about_phone_tittle" />
    <RingtonePreference
        android:key="pref_ring"
        android:summary="@string/pref_ringtone_tittle"
        android:title="@string/pref_ringtone_sum" />
    <CheckBoxPreference
        android:defaultValue="true"
        android:icon="@null"
        android:key="pref_blue"
        android:summary="@string/preference_blue_sum"
        android:title="@string/preference_blue_tittle"
        android:widgetLayout="@layout/test" />
    <PreferenceCategory
        android:key="pref_fav_category"
        android:title="@string/pref_fav_category_tittle" >
        <EditTextPreference
            android:key="fav_city"
            android:summary="@string/pref_ed_name_sum"
            android:title="@string/pref_ed_name_tittle" />
        <ListPreference
            android:dialogTitle="@string/pref_fav_title"
            android:entries="@array/fav_phone"
            android:entryValues="@array/fav_phone"
            android:key="pref_fav_phone"
            android:summary="@string/pref_fav_sum"
            android:title="@string/pref_fav_title" />
    PreferenceCategory>
    <PreferenceCategory
        android:key="pref_contact_category"
        android:title="@string/pref_fav_contact_tittle" />
    <PreferenceScreen
        android:key="pre_voicemail_setting_key"
        android:persistent="false"
        android:title="@string/pref_voicemail_tittle" >
        <Preference
            android:key="voice_mail"
            android:summary="@string/pref_voicemail_tittle"
            android:title="@string/pref_voicemail_sum" >
            <intent
                android:action="android.intent.action.VIEW"
                android:data="http://www.baidu.com" />
        Preference>
    PreferenceScreen>
PreferenceScreen>
Activity处理方法
public class PreferenceMethods extends PreferenceActivity implements
        OnPreferenceClickListener, OnPreferenceChangeListener {
    public static final String PREF_BLUE = "pref_blue";
    public static final String PREF_LISTPHONE = "pref_fav_phone";
    public static final String PREF_CITY = "fav_city";
    public static final String PREF_RING = "pref_ring";
    private CheckBoxPreference mBlueCheckPreference;
    private ListPreference mFavPhoneListPreference;
    private EditTextPreference mFavCityEdPreference;
    private RingtonePreference mRingtonePreference;
    private SwitchPreference mSwitchPreference;
    private SharedPreferences mSp;
    boolean isCheck;
    @SuppressLint("NewApi")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preference);
        mSp = PreferenceManager.getDefaultSharedPreferences(this);
        isCheck = mSp.getBoolean(PREF_BLUE, true);
        String favPhone = mSp.getString(PREF_LISTPHONE, "MI");
        mBlueCheckPreference = (CheckBoxPreference) findPreference(PREF_BLUE);
        mFavPhoneListPreference = (ListPreference) findPreference(PREF_LISTPHONE);
        mFavCityEdPreference = (EditTextPreference) findPreference(PREF_CITY);
        mRingtonePreference = (RingtonePreference) findPreference(PREF_RING);
        mSwitchPreference = (SwitchPreference) findPreference("sw_perference");
        // mSwitchPreference.setEnabled(false);
        mSwitchPreference.setChecked(true);
        mSwitchPreference.setShouldDisableView(true);
        mFavPhoneListPreference.setSummary("dddd");
        mFavPhoneListPreference.setOnPreferenceClickListener(this);
        mFavPhoneListPreference.setOnPreferenceChangeListener(this);
        mFavPhoneListPreference.setValueIndex(3);
        mBlueCheckPreference.setChecked(isCheck);
        mBlueCheckPreference.setOnPreferenceClickListener(this);
        mBlueCheckPreference.setOnPreferenceChangeListener(this);
        String favCity = mSp.getString(PREF_CITY, "成都");
        mFavCityEdPreference.setOnPreferenceClickListener(this);
        mFavCityEdPreference.setOnPreferenceChangeListener(this);
        mFavCityEdPreference.setSummary(favCity);
        String favRingtone = mSp.getString(PREF_RING, "十年");
        mRingtonePreference.setSummary(favRingtone);
        mRingtonePreference.setOnPreferenceChangeListener(this);
        mRingtonePreference.setOnPreferenceClickListener(this);
    }
    @Override
    public boolean onPreferenceClick(Preference preference) {
        return true;
    }
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        if (mBlueCheckPreference.equals(preference)) {
            isCheck = !isCheck;
            mBlueCheckPreference.setChecked(isCheck);
        }
        if (mFavPhoneListPreference.equals(preference)) {
            mFavPhoneListPreference.setSummary(newValue.toString());
        }
        if (mFavCityEdPreference.equals(preference)) {
            mFavCityEdPreference.setSummary(newValue.toString());
        }
        if (preference.equals(mRingtonePreference)) {
            mRingtonePreference.setSummary(newValue.toString());
        }
        return true;
    }
}
四、 使用Fragment 定义Preference
此方法比较建议是使用,如需了解Fragment 使用方法,请看Fragment 使用详解
1. 首先自定Fragment片段
public class SettingsFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preference);
    }
}
2.preference 实现
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <Preference
        android:key="about_phone"
        android:summary="@string/pref_about_phone_sum"
        android:title="@string/pref_about_phone_tittle" />
    <SwitchPreference
        android:key="sw_perference"
        android:summary="@string/pref_about_phone_sum"
        android:title="@string/pref_about_phone_tittle" />
    <RingtonePreference
        android:key="pref_ring"
        android:summary="@string/pref_ringtone_tittle"
        android:title="@string/pref_ringtone_sum" />
    <CheckBoxPreference
        android:defaultValue="true"
        android:icon="@null"
        android:key="pref_blue"
        android:summary="@string/preference_blue_sum"
        android:title="@string/preference_blue_tittle"
        android:widgetLayout="@layout/test" />
    <PreferenceCategory
        android:key="pref_fav_category"
        android:title="@string/pref_fav_category_tittle" >
        <EditTextPreference
            android:key="fav_city"
            android:summary="@string/pref_ed_name_sum"
            android:title="@string/pref_ed_name_tittle" />
        <ListPreference
            android:dialogTitle="@string/pref_fav_title"
            android:entries="@array/fav_phone"
            android:entryValues="@array/fav_phone"
            android:key="pref_fav_phone"
            android:summary="@string/pref_fav_sum"
            android:title="@string/pref_fav_title" />
    PreferenceCategory>
    <PreferenceCategory
        android:key="pref_contact_category"
        android:title="@string/pref_fav_contact_tittle" />
    <PreferenceScreen
        android:key="pre_voicemail_setting_key"
        android:persistent="false"
        android:title="@string/pref_voicemail_tittle" >
        <Preference
            android:key="voice_mail"
            android:summary="@string/pref_voicemail_tittle"
            android:title="@string/pref_voicemail_sum" >
            <intent
                android:action="android.intent.action.VIEW"
                android:data="http://www.baidu.com" />
        Preference>
    PreferenceScreen>
PreferenceScreen>
3. Activity 中调用Fragment
public class SettingPreferenceActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_preference);
        getFragmentManager().beginTransaction()
                .replace(R.id.fm_pref, new SettingsFragment()).commit();
    }
}
4.填充布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <FrameLayout
        android:id="@+id/fm_pref"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
LinearLayout>
五、实现效果如下:

Preference使用方法详解
至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除。同时感谢您的阅读,期待您的关注。
