極力推薦文章:歡迎收藏
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" >
<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 使用詳解
-
- 首先自定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>
-
- 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.實現效果如下:
至此,本篇已結束,如有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!