• Preference 使用详解


    极力推荐文章:欢迎收藏
    Android 干货分享

    阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android

    本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

    1. Perference 简介
    2. Perference 使用方法
    3. 使用XML定义Preference
    4. 使用Fragment 定义Preference
    5. 实现效果

    PreferenceAndroid 中重要的控件之一,比如 Settings 模块大部分都是通过Preference 实现的,本章将研究preference 使用方法

    1.Preference 简介

    Preference 继承关系

    java.lang.Object
        ↳ android.preference.Preference 
    

    Preference 常用于APP 设置模块,比如 Android 系统中的Settings 模块,它可以默认把我们的数据保存在SharePreference中。

     settings中常用Preference 举例

    • 键值对(key-values) 获取方法同 SharePreference
    		SharedPreferences	mSp = PreferenceManager.getDefaultSharedPreferences(this);
    		String favPhone = mSp.getString(PREF_LISTPHONE, "MI");
    
    
    • Preference 数据保存

    Preference通过key-values 键值对的形式保存。
    保存路径如下:
    /data/data/包名/shared_prefs/包名_preferences.xml

    Preference 数据保存路径

    2. Perference 使用方法

    一般在XML文件夹中创建xml 文件来对Settings进行布局,布局文件中通常使用PreferenceScreen容器,PreferenceScreen 包含多个 Preference 控件,PreferenceCategory 可以设置分类标题。

    常用Preference 控件如下:
    PreferenceScreen
    CheckBoxPreference
    EditTextPreference
    ListPreference
    PreferenceCategory
    RingtonePreference.

    上面控件等同Layout布局中的ViewPreferenceScreen 等同Layout布局中的ViewGroup。在Android 3.0 之前需要继承PreferenceActivity(此方法不是太推荐使用,已被启用),3.0 之后更高版本,则需要继承Activity,使用Fragment 控制布局,然后实现不同控件的处理事件。

    Perference 常用使用方法如下两种:

      1. 使用XML定义Preference
      1. 使用Fragment 定义Preference

    3. 使用XML定义Preference

    此方法有点过时,不太建议使用,但目前还可以用。
    其使用方法如下:

    1. XML 文件保存在res/xml/目录中 例如: preferences.xml
    2. 继承PreferenceActivity onCreate方法中直接调用addPreferencesFromResource(R.xml.preference);添加布局
    3. 点击事件处理setOnPreferenceClickListener ,内容发生改变事件处理 setOnPreferenceChangeListener

    Preference使用案例如下:
    res /xml /preferences.xml

    <?xml version="1.0" encoding="utf-8"?>
    <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;
    	}
    }
    

    4. 使用Fragment 定义Preference

    此方法比较建议是使用,如需了解Fragment 使用方法,请看Fragment 使用详解

      1. 首先自定Fragment片段

    a.自定义 SettingsFragment

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

    b.preference 实现

    <?xml version="1.0" encoding="utf-8"?>
    <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>
    
      1. 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();
    	}
    
    }
    
    • 填充布局
    <?xml version="1.0" encoding="utf-8"?>
    <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>
    

    5.实现效果如下:

    Preference使用方法详解

    至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

    微信关注公众号:  程序员Android,领福利

  • 相关阅读:
    数据库基础+重置root密码
    Bug定级
    测试用例和测试方法
    测试基础
    HDOJ-1010 Tempter of the Bone(dfs)
    POJ
    HDU-2089 不要62 (数位DP)
    Happy!
    LOJ-1422 万圣节服装
    数字三角形(数塔问题)
  • 原文地址:https://www.cnblogs.com/wangjie1990/p/11310876.html
Copyright © 2020-2023  润新知