Android開發之 Preference首選項
首選項最常使用的地方是系統的設定列表或應用程式的設定頁。本示例在android 4.0+上執行。
在res/xml檔案下建立xml檔案,設定需要的控制元件。下面的xml檔案使用了PreferenceCategory 、CheckBoxPreference、ListPreference。PreferenceCategory 是一個標題欄分隔符,表示分類。CheckBoxPreference複選框控制元件。ListPreference列表單選控制元件。常用的屬性有android:key、android:title、android:summary、android:defaultValue。android:key相當於控制元件的id,在xml檔案是鍵值對的鍵。android:title顯示的名稱。android:summary對此控制元件的藐視或解釋。android:defaultValue首選項的預設值,即鍵值對的預設值。
ListPreference中的 android:entries屬性是引用的選項列表, android:entryValues屬性引用了各個選項對應值的列表。
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="設定">
<CheckBoxPreference
android:defaultValue="true"
android:icon="@mipmap/set"
android:key="PREF_CHECK_BOX"
android:summary ="這裡是描述"
android:title="Check 選項" />
<ListPreference
android:defaultValue="100"
android:entries="@array/size_entry"
android:entryValues="@array/size_entry_value"
android:icon="@mipmap/ic_launcher"
android:key="PREF_LIST"
android:summary="list 描述"
android:title="list選項" />
</PreferenceCategory>
</PreferenceScreen>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--選項列表-->
<string-array name="size_entry">
<item>大</item>
<item>中</item>
<item>小</item>
</string-array>
<!--選項值的列表-->
<string-array name="size_entry_value">
<item>大</item>
<item>中</item>
<item>小</item>
</string-array>
</resources>
建立一個類並繼承PreferenceFragment,重寫onCreate()方法。
public class PreferenceF extends PreferenceFragment{
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//新增上面的xml檔案
addPreferencesFromResource(R.xml.perference);
}
}
建立Activity,在佈局檔案中引用PreferenceFragment。
<fragment
android:id="@+id/fragment_pf"
//通過name引用PreferenceFragment
android:name="cn.xd.android8.pre.PreferenceF"
android:layout_width="match_parent"
android:layout_height="match_parent" />
執行效果如下:
下面介紹另一種使用首選項的方法,建立xml檔案,新增header,設定引用的fragment。
//p_header.xml
<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:fragment="cn.xd.android8.pre.PreferenceF"
android:icon="@mipmap/ic_launcher"
android:summary="這是header的描述"
android:title="header">
</header>
</preference-headers>
建立類並繼承PreferenceActivity,重寫onBuildHeaders()、isValidFragment()方法。
@Override
public void onBuildHeaders(List<Header> target) {
super.onBuildHeaders(target);
//新增引用
loadHeadersFromResource(R.xml.p_header,target);
}
@Override
protected boolean isValidFragment(String fragmentName) {
return true;
}
這樣執行後,與上一個顯示不同的是先顯示p_header檔案中的內容。
除了上面用到控制元件,還有EditTextPreference、MultiSelectListPreference、SwitchPreference等。EditTextPreference記錄一段文字資訊。MultiSelectListPreference多選的列表。SwitchPreference開關。
如果沒有設定監聽事件,你會發現點選改變控制元件的狀態會被記錄,如果設定了監聽事件,就需要新增程式碼來完成狀態的改變和記錄。
如果想要實現點選某一首選項,進入另一個設定頁面,請使用PreferenceScreen。
//可以引用PreferenceFragment,也可以在其內部新增
//android:layout屬效能夠引用一個自定義的layout
<PreferenceScreen
android:fragment="cn.xd.android8.pre.PreferenceF"
android:layout="@layout/item_test"
android:summary="PreferenceScreen"
android:title="PreferenceScreen">
</PreferenceScreen>
<PreferenceScreen
android:summary="PreferenceScreen"
android:title="PreferenceScreen">
<CheckBoxPreference
android:key="PREF_CHECK_BOX3"
android:summary="test"
android:title="CheckBoxPreference" />
</PreferenceScreen>
設定一個可點選又沒有狀態類似TextView控制元件,要使用PreferenceScreen且設定setOnPreferenceClickListener事件。
<PreferenceScreen
android:key="PREF_PreferenceScreen"
android:summary="PreferenceScreen"
android:title="充當點選的TextView">
</PreferenceScreen>
//獲取控制元件例項,設定事件。CheckBoxPreference這類控制元件要設定setOnPreferenceChangeListener()事件。
public void onCreate(@Nullable Bundle savedInstanceState) {
........
PreferenceScreen PREF_PreferenceScreen=(PreferenceScreen)
findPreference("PREF_PreferenceScreen");
PREF_PreferenceScreen.setOnPreferenceClickListener(.........);
}