1. 程式人生 > >Android開發之 Preference首選項

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(.........);

}