雙窗格定制

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_messageBaseFragment的實例上顯示 UX 限制的阻塞視圖。

圖 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