效果圖
其實(shí)這種選項(xiàng)的界面溪猿,不需要自己去一個(gè)一個(gè)選項(xiàng)地去做妖滔。完后還要自己去保存設(shè)置穴吹,保存了還要讀取真的是嗶了狗了。
還好Android為我們提供了一些封裝好的東西羽历。那就是PreferenceActivity
和PreferenceFragment
焊虏。本文將會(huì)使用PreferenceFragment
作為范例。
PreferenceFragment
從名字中不難看出秕磷,
PreferenceFragment
是Fragment
的一個(gè)子類诵闭,所以大致使用上是差不多的,除了一些特性之外澎嚣。
使用方式
有兩種加載選項(xiàng)的的方式:
- xml加載(以此為范例)
- 代碼加載
幾個(gè)概念
-
PreferenceScreen
: 沒有什么資料疏尿,找到大多數(shù)都是理解不通的。個(gè)人認(rèn)為就是一個(gè)類似ViewGroup的容器易桃,只是ViewGroup里面裝的是View褥琐。PreferenceScreen裝的是Preference。 -
PreferenceCategory
: 分類晤郑,就像你的設(shè)置有分應(yīng)用設(shè)置和系統(tǒng)設(shè)置敌呈。可以提供一個(gè)頭部標(biāo)題說明 -
Preference
: 就是一個(gè)選項(xiàng)
支持類型
-
Preference
: 普通選項(xiàng) -
EditTextPreference
: 點(diǎn)擊后彈出編輯框窗口的選項(xiàng) -
SwitchPreference
: 開關(guān)選項(xiàng) -
RingtonePreference
: 打開內(nèi)容提供 -
CheckBoxPreference
: 帶復(fù)選按鈕 -
ListPreference
: 復(fù)合的單選按鈕 -
MultiSelectListPreference
: 復(fù)合的復(fù)選按鈕
使用
首先我們新建兩份數(shù)組資源在
在
/res/values
下
wifi.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="wifi_entities">
<item>WIFI1</item>
<item>WIFI2</item>
<item>WIFI3</item>
<item>WIFI4</item>
<item>WIFI5</item>
<item>WIFI6</item>
</string-array>
<string-array name="wifi_values">
<item>無線網(wǎng)絡(luò)1</item>
<item>無線網(wǎng)絡(luò)2</item>
<item>無線網(wǎng)絡(luò)3</item>
<item>無線網(wǎng)絡(luò)4</item>
<item>無線網(wǎng)絡(luò)5</item>
<item>無線網(wǎng)絡(luò)6</item>
</string-array>
</resources>
type.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="type_entities">
<item>TYPE1</item>
<item>TYPE2</item>
<item>TYPE3</item>
<item>TYPE4</item>
<item>TYPE5</item>
</string-array>
<string-array name="type_values">
<item>類型1</item>
<item>類型2</item>
<item>類型3</item>
<item>類型4</item>
<item>類型5</item>
</string-array>
</resources>
這里就先不說為什么每個(gè)數(shù)組文件里面要有兩個(gè)數(shù)組造寝】暮椋看下面。诫龙。析显。
新建一個(gè)自定義布局文件(可選)
在
/res/layout
下新建text_view.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Hello world">
</TextView>
新建Preference資源文件
在
/res
下面新建xml
目錄
preference_demo.xml
在
/res/xml
下新建preference_demo.xml
文件
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="普通選項(xiàng)">
<Preference
android:key="option11"
android:summary="這是選項(xiàng)1"
android:title="點(diǎn)我" />
<Preference
android:key="option111"
android:layout="@layout/text_view" />
<EditTextPreference
android:key="option12"
android:summary="這是選項(xiàng)2"
android:title="名稱" />
<SwitchPreference
android:checked="true"
android:key="option13"
android:summary="這是選項(xiàng)3"
android:summaryOff="關(guān)閉選項(xiàng)3"
android:summaryOn="開啟選項(xiàng)3"
android:title="通知欄常駐" />
<RingtonePreference
android:key="option14"
android:summary="這是選項(xiàng)4"
android:title="打開" />
<CheckBoxPreference
android:key="option15"
android:layout="?android:attr/preferenceLayoutChild"
android:summary="QQ選項(xiàng)"
android:summaryOff="禁止QQ"
android:summaryOn="允許QQ"
android:title="QQ彈窗" />
<CheckBoxPreference
android:dependency="option15"
android:key="option20"
android:summary="微信選項(xiàng)"
android:summaryOff="禁止微信"
android:summaryOn="允許微信"
android:title="微信彈窗" />
<CheckBoxPreference
android:checked="true"
android:key="option16"
android:summary="微博選項(xiàng)"
android:summaryOff="禁止微博"
android:summaryOn="允許我播"
android:title="微博彈窗" />
</PreferenceCategory>
<PreferenceCategory android:title="復(fù)合選項(xiàng)">
<ListPreference
android:dialogTitle="對(duì)話框標(biāo)題"
android:entries="@array/wifi_entities"
android:entryValues="@array/wifi_values"
android:key="option17"
android:summary="請(qǐng)選擇WIFI"
android:title="WIFI" />
<MultiSelectListPreference
android:dialogIcon="@mipmap/ic_launcher"
android:entries="@array/type_entities"
android:entryValues="@array/type_values"
android:key="option18"
android:title="消息類型" />
<PreferenceScreen
android:key="option19"
android:summary="打開我的博客"
android:title="我的博客">
<intent
android:action="android.intent.action.VIEW"
android:data="http://august1996.top" />
</PreferenceScreen>
</PreferenceCategory>
</PreferenceScreen>
PreferenceScreen
的另一個(gè)用法就是和Intent
結(jié)合使用
有一些屬性還是需要說明一下的
-
key
: 最多的屬性,因?yàn)镻reference這個(gè)數(shù)據(jù)的存取就是使用SharedPreferences
來實(shí)現(xiàn)的赐稽。所以保存時(shí)需要一個(gè)key的叫榕。 -
summary
: 小標(biāo)題或者叫做簡(jiǎn)述,一般是用于對(duì)選項(xiàng)的簡(jiǎn)要說明姊舵。 -
summaryOff
: 具有開關(guān)屬性的選項(xiàng)關(guān)閉時(shí)的summary -
summaryOn
: 具有開關(guān)屬性的選項(xiàng)打開時(shí)的summary -
title
: 選項(xiàng)的標(biāo)題 -
dialogTitle
: 彈出消息框的標(biāo)題 -
dialogMessage :彈出的消息框的內(nèi)容晰绎,會(huì)把
MultiSelectListPreference和
ListPreference`的選項(xiàng)覆蓋 -
layout
: 選項(xiàng)的布局,因此選項(xiàng)是支持自定義布局的
針對(duì)ListPreference和MultiSelectListPreference的屬性
-
entries
: 相當(dāng)于上面的key括丁,只不過因?yàn)槭橇斜碥裣拢跃陀脭?shù)組的形式存放 -
entryValues
: 這個(gè)是每個(gè)選項(xiàng)的值,與entities的關(guān)系就是key和value的關(guān)系
因此上面定義的數(shù)組資源中史飞,兩個(gè)數(shù)組的長(zhǎng)度必須相等
代碼
public class PreferenceFrag extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preference_demo);
}
}
此處不需要setContentView尖昏,而是直接addPreferencesFromResource從資源中去加載。
更多交互
Preference mOption1 = findPreference("option1");
mOption1.setOnPreferenceClickListener(this);
mOption1.setOnPreferenceChangeListener(this);
第一行我們通過鍵值去查找對(duì)應(yīng)的Preference
第二行我們?nèi)ピO(shè)置對(duì)應(yīng)的Preference的點(diǎn)擊事件
第三行我們?nèi)ピO(shè)置對(duì)應(yīng)的Preference的值改變時(shí)的監(jiān)聽事件