妥善安排設定項目 Android Jetpack 的一部分。
設定畫面過大,使用者可能難以找到 並指定要變更的設定Preference 程式庫提供 整理您的設定畫面。
Preference 類別
如有多個相關
單一 Preference
物件
可以使用
PreferenceCategory
。A 罩杯
PreferenceCategory
會顯示類別標題,並在視覺上區隔出
類別
如要在 XML 中定義 PreferenceCategory
,請用Preference
PreferenceCategory
,如下所示:
<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 顯示包含兩個類別的簡單階層:郵件和 同步處理:

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

如要將畫面與 Preference
連結,您可以在 XML 或 XML 中宣告 app:fragment
您可以運用
Preference.setFragment()
。
在出現下列情況時,啟動 PreferenceFragmentCompat
的完整套件名稱
則輕觸 Preference
,如以下範例所示:
<Preference
app:fragment="com.example.SyncFragment"
.../>
當使用者輕觸含有關聯 Fragment
的 Preference
時,介面
種方式
PreferenceFragmentCompat.OnPreferenceStartFragmentCallback.onPreferenceStartFragment()
敬上
方法。這個方法可讓您處理顯示新畫面的位置和
系統會在周圍的 Activity
中實作畫面。
常見的實作方式如下所示:
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
}
}
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
使用巢狀結構在相同的 XML 資源中宣告巢狀階層
系統已不再支援 <PreferenceScreen>
,使用巢狀 Fragment
物件
。
使用單獨的活動
或者,如果您需要大幅自訂每個畫面,或是希望在畫面之間進行完整的 Activity
轉換作業,則可針對每個 PreferenceFragmentCompat
使用單獨的 Activity
。這樣一來,您就可以完全自訂每個 Activity
及其對應的設定畫面。大多數應用程式都不行
建議;請改用 Fragments
。
如要進一步瞭解如何從 Preference
啟動 Activity
,請參閱
偏好設定動作。