双窗格自定义

Android 12 引入了双窗格设计,左侧是静态 L0 菜单,右侧是内容窗格。此功能引入了许多新的自定义选项。本页详细介绍了这些功能,并说明了如何自定义您自己的偏好设置。

恢复为单窗格

默认情况下,当应用窗口宽度大于或等于 1400dp 时,CarSettings 现在会显示双窗格视图,否则会显示单窗格视图。要为特定设备自定义此设置,请使用运行时资源叠加层 (RRO) 来定位必要的配置值

说明
config_global_force_single_pane 如果整个应用要在单窗格配置中运行,则设置为 true
config_homepage_fragment_class 指定主页的起始片段。在双窗格中,这用于内容窗格中的初始片段。在单窗格中,这应该是主页片段。

标题键

由于不同的 CarSettings 活动可以具有自定义的 IA,因此提供了标题键映射以简化自定义。在 AndroidManifest.xml 中,每个支持双窗格的活动在其元数据中都指定了 TOP_LEVEL_HEADER_KEY。此值指向 res/values/header_keys.xml 中指定的键,该键映射到起始片段所属的顶层菜单项的偏好设置键。因此,如果活动的起始片段发生更改,或者 IA 经过重新排列,以致特定片段属于不同的顶层偏好设置,则可以更新 header_keys.xml 文件中的相关映射以指定正确的值。

自定义活动布局

BaseCarSettingsActivity 的布局位于 res/layout/car_setting_activity 中以及以下部分

说明
top_level_menu 在双窗格配置中显示的顶层菜单片段。此部分的宽度由 top_level_menu_width 指定。底盘基本布局(带工具栏)围绕此视图进行封装。
top_level_divider 分隔两个窗格的垂直线,其宽度可以使用 top_level_divider_width 自定义。
fragment_container_wrapper 内容窗格(或单窗格配置中的主窗格)的封装布局。底盘基本布局(带工具栏)围绕此视图进行封装。
settings_focus_parking_view FocusParkingView 的自定义实现,用于在需要时保持旋转焦点。
fragment_container 主内容容器。内容片段使用此容器作为目标布局。
restricted_message UX 限制的阻止视图,将显示在 BaseFragment 的实例上。

图 1. 双窗格布局

顶层偏好设置

顶层偏好设置是自定义 CarUiPreferences,其布局略有修改,以更改偏好设置高度和背景形状。有许多不同的方法可以自定义这些偏好设置的外观

说明
res/layout/top_level_preference.xml 叠加整个偏好设置布局。
top_level_preference_min_height 顶层偏好设置的最小高度。根据内容(例如,存在副标题),偏好设置可能高于此值。
top_level_preference_corner_radius 边角圆角半径。
top_level_preference_background 未突出显示时顶层偏好设置的背景。
top_level_preference_highlight 突出显示时顶层偏好设置的背景。

顶层图标

图 2 说明了顶层图标现在如何由彩色背景形状内的矢量图标组成。此形状当前配置为支持椭圆形或矩形。默认情况下,形状设置为椭圆形。

要更改默认设置,请修改 config_top_level_icon_shape 中的值(其中 0 为矩形,1 为椭圆形)。这些图标是通过将前景图标从背景形状中嵌入 top_level_foreground_icon_inset 来创建的。每个顶层图标都有一个在 res/values/colors.xml 中指定的前景颜色和一个在 res/color 文件夹中指定的背景颜色。

要创建自定义外观,您可以覆盖所有颜色值。

图 2. 顶层偏好设置组件

对于属于 config_top_level_injection_categories 指定类别的注入偏好设置的图标,也将其视为顶层图标。提供的图标会嵌入相同的值,并嵌入到与所有其他顶层图标相同的形状中(见上文)。但是,背景是通过按以下顺序查看以下属性来确定的:

  1. com.android.settings.bg.argb 来自注入应用的元数据。
  2. com.android.settings.bg.hint 来自注入应用的元数据。
  3. top_level_injected_default_backgroundres/values/colors.xml 中指定。

要忽略注入应用数据并始终使用默认背景,请将 config_top_level_injection_background_always_use_default 设置为 true