整理设置 Android Jetpack 的一部分。
如果设置屏幕庞大繁杂,用户可能会难以找到 更改特定设置Preference 库提供 更好地整理设置页面的方法。
偏好设置类别
如果您有多个相关的
单个 Preference
对象
您可以使用
PreferenceCategory
。答
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 显示了一个简单的层次结构,它包含两个类别:Messages 和 同步。

图 3 显示了分成多个屏幕的同一组偏好设置:

如需关联带有 Preference
的屏幕,您可以在 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 资源在同一 XML 资源中声明嵌套层次结构
不再支持 <PreferenceScreen>
。使用嵌套的 Fragment
对象
。
使用单独的 activity
相对地,如果您需要深入自定义每个屏幕,或者希望在各个屏幕之间切换时执行完整的 Activity
转换,则可以为每个 PreferenceFragmentCompat
使用单独的 Activity
。这样一来,您就可以全面自定义每个 Activity
及其对应的设置屏幕。对于大多数应用,我们不会
推荐此内容;请改用 Fragments
(如前所述)。
如需详细了解如何从 Preference
启动 Activity
,请参阅
偏好设置操作。