整理您的设置 是 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
使用嵌套的 <PreferenceScreen>
在同一 XML 资源中声明嵌套层次结构不再受支持。请改用嵌套的 Fragment
对象。
使用单独的活动
或者,如果您需要大量自定义每个屏幕,或者如果您希望在屏幕之间进行完全的 Activity
转换,您可以为每个 PreferenceFragmentCompat
使用单独的 Activity
。通过这样做,您可以完全自定义每个 Activity
及其相应的设置屏幕。对于大多数应用,我们不建议这样做;相反,请按前面所述使用 Fragments
。
有关从 Preference
启动 Activity
的更多信息,请参阅 首选项操作。