极力推荐文章:欢迎收藏
Android 干货分享
阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android
本篇文章主要介绍 Android
开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:
- Perference 简介
- Perference 使用方法
- 使用XML定义Preference
- 使用Fragment 定义Preference
- 实现效果
Preference
在Android
中重要的控件之一,比如 Settings
模块大部分都是通过Preference
实现的,本章将研究preference
使用方法
1.Preference 简介
Preference 继承关系
java.lang.Object↳ android.preference.Preference
Preference
常用于APP
设置模块,比如Android
系统中的Settings
模块,它可以默认把我们的数据保存在SharePreference
中。
- 键值对
(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
2. Perference 使用方法
一般在XML
文件夹中创建xml
文件来对Settings
进行布局,布局文件中通常使用PreferenceScreen
容器,PreferenceScreen
包含多个 Preference
控件,PreferenceCategory
可以设置分类标题。
常用Preference
控件如下:PreferenceScreen
CheckBoxPreference
EditTextPreference
ListPreference
PreferenceCategory
RingtonePreference.
上面控件等同Layout
布局中的View
,PreferenceScreen
等同Layout
布局中的ViewGroup
。在Android 3.0
之前需要继承PreferenceActivity
(此方法不是太推荐使用,已被启用),3.0
之后更高版本,则需要继承Activity
,使用Fragment
控制布局,然后实现不同控件的处理事件。
Perference
常用使用方法如下两种:
-
- 使用XML定义
Preference
- 使用XML定义
-
- 使用
Fragment
定义Preference
- 使用
3. 使用XML定义Preference
此方法有点过时,不太建议使用,但目前还可以用。
其使用方法如下:
- 将
XML
文件保存在res/xml/
目录中 例如:preferences.xml
- 继承
PreferenceActivity
在onCreate
方法中直接调用addPreferencesFromResource(R.xml.preference);
添加布局 - 点击事件处理
setOnPreferenceClickListener
,内容发生改变事件处理setOnPreferenceChangeListener
Preference
使用案例如下:res /xml /preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" ><Preferenceandroid:key="about_phone"android:summary="@string/pref_about_phone_sum"android:title="@string/pref_about_phone_tittle" /><SwitchPreferenceandroid:key="sw_perference"android:summary="@string/pref_about_phone_sum"android:title="@string/pref_about_phone_tittle" /><RingtonePreferenceandroid:key="pref_ring"android:summary="@string/pref_ringtone_tittle"android:title="@string/pref_ringtone_sum" /><CheckBoxPreferenceandroid: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" /><PreferenceCategoryandroid:key="pref_fav_category"android:title="@string/pref_fav_category_tittle" ><EditTextPreferenceandroid:key="fav_city"android:summary="@string/pref_ed_name_sum"android:title="@string/pref_ed_name_tittle" /><ListPreferenceandroid: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><PreferenceCategoryandroid:key="pref_contact_category"android:title="@string/pref_fav_contact_tittle" /><PreferenceScreenandroid:key="pre_voicemail_setting_key"android:persistent="false"android:title="@string/pref_voicemail_tittle" ><Preferenceandroid:key="voice_mail"android:summary="@string/pref_voicemail_tittle"android:title="@string/pref_voicemail_sum" ><intentandroid:action="android.intent.action.VIEW"android:data="http://www.baidu.com" /></Preference></PreferenceScreen></PreferenceScreen>
Activity
处理方法
public class PreferenceMethods extends PreferenceActivity implementsOnPreferenceClickListener, 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")@Overridepublic 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);}@Overridepublic boolean onPreferenceClick(Preference preference) {return true;}@Overridepublic 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 使用详解
-
- 首先自定Fragment片段
a.自定义 SettingsFragment
public class SettingsFragment extends PreferenceFragment {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Load the preferences from an XML resourceaddPreferencesFromResource(R.xml.preference);}
}
b.preference 实现
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" ><Preferenceandroid:key="about_phone"android:summary="@string/pref_about_phone_sum"android:title="@string/pref_about_phone_tittle" /><SwitchPreferenceandroid:key="sw_perference"android:summary="@string/pref_about_phone_sum"android:title="@string/pref_about_phone_tittle" /><RingtonePreferenceandroid:key="pref_ring"android:summary="@string/pref_ringtone_tittle"android:title="@string/pref_ringtone_sum" /><CheckBoxPreferenceandroid: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" /><PreferenceCategoryandroid:key="pref_fav_category"android:title="@string/pref_fav_category_tittle" ><EditTextPreferenceandroid:key="fav_city"android:summary="@string/pref_ed_name_sum"android:title="@string/pref_ed_name_tittle" /><ListPreferenceandroid: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><PreferenceCategoryandroid:key="pref_contact_category"android:title="@string/pref_fav_contact_tittle" /><PreferenceScreenandroid:key="pre_voicemail_setting_key"android:persistent="false"android:title="@string/pref_voicemail_tittle" ><Preferenceandroid:key="voice_mail"android:summary="@string/pref_voicemail_tittle"android:title="@string/pref_voicemail_sum" ><intentandroid:action="android.intent.action.VIEW"android:data="http://www.baidu.com" /></Preference></PreferenceScreen></PreferenceScreen>
-
- Activity 中调用Fragment
public class SettingPreferenceActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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" ><FrameLayoutandroid:id="@+id/fm_pref"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>
5.实现效果如下:
至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!