整理您的设置 属于 Android Jetpack 的一部分。
大型复杂设置屏幕可能会让用户难以找到想要更改的特定设置。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 显示了一个包含两个类别的简单层次结构:消息和同步。

图 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
不再支持在同一 XML 资源中使用嵌套的 <PreferenceScreen>
声明嵌套层次结构。请改用嵌套的 Fragment
对象。
使用单独的 Activity
另外,如果您需要大量自定义每个屏幕,或者想要屏幕之间完整的 Activity
过渡效果,您可以为每个 PreferenceFragmentCompat
使用单独的 Activity
。通过这种方式,您可以完全自定义每个 Activity
及其相应的设置屏幕。对于大多数应用,我们不推荐这样做;请改为使用前面所述的 Fragment
。
如需详细了解如何从 Preference
启动 Activity
,请参阅偏好设置操作。