整理设置 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>

结果如下所示:

显示偏好设置和类别的图片
图 1. 类别中的偏好设置。

将层次结构拆分为多个屏幕

如果您有大量 Preference 对象或不同的类别, 以便在不同的屏幕上显示它们每个屏幕都是 PreferenceFragmentCompat 具有自己的单独层次结构。Preference 个对象 然后,可以链接到包含 偏好设置。

图 2 显示了一个简单的层次结构,它包含两个类别:Messages同步

显示具有层次结构的偏好设置屏幕的图片
图 2. 包含两个类别的简单层次结构。

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

一张图片,显示划分为多个屏幕的层次结构
图 3. 拆分为多个屏幕的层次结构。

如需关联带有 Preference 的屏幕,您可以在 XML 中声明 app:fragment,或 您可以使用 Preference.setFragment()。 在以下情况下启动 PreferenceFragmentCompat 的完整软件包名称: 则点按 Preference,如以下示例所示:

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

当用户点按带有关联 FragmentPreference 时,系统会调用接口方法 PreferenceFragmentCompat.OnPreferenceStartFragmentCallback.onPreferenceStartFragment()。此方法可用于处理新屏幕的显示,以及 屏幕是在周围的 Activity 中实现的。

典型实现一般如下所示:

KotlinJava
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 资源中声明嵌套层次结构 不再支持 &lt;PreferenceScreen&gt;。使用嵌套的 Fragment 对象 。

使用单独的 activity

相对地,如果您需要深入自定义每个屏幕,或者希望在各个屏幕之间切换时执行完整的 Activity 转换,则可以为每个 PreferenceFragmentCompat 使用单独的 Activity。这样一来,您就可以全面自定义每个 Activity 及其对应的设置屏幕。对于大多数应用,我们不会 推荐此内容;请改用 Fragments(如前所述)。

如需详细了解如何从 Preference 启动 Activity,请参阅 偏好设置操作