整理設定 Android Jetpack 的一部分。

設定畫面龐大而複雜,可能會導致使用者難以找到想要變更的特定設定。Preference 程式庫提供以下方式,協助您妥善整理設定畫面。

Preference 類別

如果單一畫面中有多個相關的 Preference 物件,可以使用 PreferenceCategory 將這些物件分組。PreferenceCategory 會顯示類別標題,並在視覺上將類別分隔開來。

如要在 XML 中定義 PreferenceCategory,請使用 PreferenceCategory 納入 Preference 標記,如下所示:

<PreferenceScreen
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <PreferenceCategory
        app:key="notifications_category"
        app:title="Notifications">

        <SwitchPreferenceCompat
            app:key="notifications"
            app:title="Enable message notifications"/>

    </PreferenceCategory>

    <PreferenceCategory
        app:key="help_category"
        app:title="Help">

        <Preference
            app:key="feedback"
            app:summary="Report technical issues or suggest new features"
            app:title="Send feedback"/>

    </PreferenceCategory>

</PreferenceScreen>

結果如下所示:

顯示各類別偏好設定的圖片
圖 1. 按類別劃分的偏好設定。

將階層分割成多個畫面

如果您有大量 Preference 物件或不同的類別,可以分別在不同的螢幕上顯示。每個畫面都是 PreferenceFragmentCompat,具有各自的獨立階層。初始畫面中的 Preference 物件可連結至包含相關偏好設定的子畫面。

圖 2 顯示包含兩個類別的簡單階層:「Messages」和「Sync」

顯示包含階層的偏好設定畫面圖片
圖 2. 包含兩個類別的簡單階層。

圖 3 顯示分割為多個畫面的同一組偏好設定:

顯示分割至多個畫面的階層圖片
圖 3. 分割成多個畫面的階層。

如要連結畫面與 Preference,您可以在 XML 中宣告 app:fragment,或使用 Preference.setFragment()。輕觸 Preference 時啟動 PreferenceFragmentCompat 的完整套件名稱,如以下範例所示:

<Preference
        app:fragment="com.example.SyncFragment"
        .../>

當使用者輕觸含有關聯 FragmentPreference 時,系統會呼叫介面方法 PreferenceFragmentCompat.OnPreferenceStartFragmentCallback.onPreferenceStartFragment()。這個方法可讓您處理顯示新畫面,並在周圍的 Activity 中實作畫面。

常見的實作方式一般為如下所示:

Kotlin

class MyActivity : AppCompatActivity(),
    PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
    ...
    override fun onPreferenceStartFragment(caller: PreferenceFragmentCompat, pref: Preference): Boolean {
        // Instantiate the new Fragment.
        val args = pref.extras
        val fragment = supportFragmentManager.fragmentFactory.instantiate(
                classLoader,
                pref.fragment)
        fragment.arguments = args
        fragment.setTargetFragment(caller, 0)
        // Replace the existing Fragment with the new Fragment.
        supportFragmentManager.beginTransaction()
                .replace(R.id.settings_container, fragment)
                .addToBackStack(null)
                .commit()
        return true
    }
}

Java

public class MyActivity extends AppCompatActivity implements
        PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
    ...
    @Override
    public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) {
        // Instantiate the new Fragment.
        final Bundle args = pref.getExtras();
        final Fragment fragment = getSupportFragmentManager().getFragmentFactory().instantiate(
                getClassLoader(),
                pref.getFragment());
        fragment.setArguments(args);
        fragment.setTargetFragment(caller, 0);
        // Replace the existing Fragment with the new Fragment.
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.settings_container, fragment)
                .addToBackStack(null)
                .commit();
        return true;
    }
}

PreferenceScreens

系統不再支援使用巢狀 &lt;PreferenceScreen&gt; 在相同的 XML 資源中宣告巢狀階層。請改用巢狀 Fragment 物件。

使用單獨的活動

或者,如果您需要大幅自訂每個畫面,或是希望在畫面之間進行完整的 Activity 轉換作業,則可針對每個 PreferenceFragmentCompat 使用單獨的 Activity。這樣一來,您就可以完全自訂每個 Activity 及其對應的設定畫面。對於大多數應用程式,我們不建議這麼做,而是如前所述使用 Fragments

如要進一步瞭解如何從 Preference 啟動 Activity,請參閱「偏好設定動作」。