整理設定 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>
結果如下所示:
將階層分割成多個畫面
如果您有大量 Preference
物件或不同的類別,可以分別在不同的螢幕上顯示。每個畫面都是 PreferenceFragmentCompat
,具有各自的獨立階層。初始畫面中的 Preference
物件可連結至包含相關偏好設定的子畫面。
圖 2 顯示包含兩個類別的簡單階層:「Messages」和「Sync」。
圖 3 顯示分割為多個畫面的同一組偏好設定:
如要連結畫面與 Preference
,您可以在 XML 中宣告 app:fragment
,或使用 Preference.setFragment()
。輕觸 Preference
時啟動 PreferenceFragmentCompat
的完整套件名稱,如以下範例所示:
<Preference app:fragment="com.example.SyncFragment" .../>
當使用者輕觸含有關聯 Fragment
的 Preference
時,系統會呼叫介面方法 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
系統不再支援使用巢狀 <PreferenceScreen>
在相同的 XML 資源中宣告巢狀階層。請改用巢狀 Fragment
物件。
使用單獨的活動
或者,如果您需要大幅自訂每個畫面,或是希望在畫面之間進行完整的 Activity
轉換作業,則可針對每個 PreferenceFragmentCompat
使用單獨的 Activity
。這樣一來,您就可以完全自訂每個 Activity
及其對應的設定畫面。對於大多數應用程式,我們不建議這麼做,而是如前所述使用 Fragments
。
如要進一步瞭解如何從 Preference
啟動 Activity
,請參閱「偏好設定動作」。