車輛設定 (packages/apps/Car/Settings
) 專為 Android Automotive OS (AAOS) 提供。車輛設定與手機設定 (packages/apps/Settings
) 不同。雖然車輛設定包含一些熟悉的手機設定,但也提供汽車化的視覺使用者介面、最佳化駕駛員分心程度,以及許多原始設備製造商 (OEM) 自訂進入點。
除了下方提供的「車輛設定」總覽,請參閱下列相關主題,進一步瞭解「車輛設定」:
架構和指南
車輛設定中的大部分頁面都會以一系列延伸自 SettingsFragment 的片段實作,每個頁面都有在 CarSettingActivities 中定義的專屬活動。這些靜態活動是從 BaseCarSettingsActivity 擴充而來。不過,此規則有幾個例外狀況,例如某些特殊的元件會擴充 BaseFragment 而非 SettingsFragment
,以及位於 CarSettingActivities 外部的某些活動,這些都應視為例外狀況 (而非可遵循的模式)。
靜態偏好設定
您可以使用 Preference 或 CarUiPreference 標記,在 XML 中定義靜態偏好設定。SettingsFragment
實作會使用 getPreferenceScreenResId()
方法,定義哪個 XML 檔案包含要顯示的靜態偏好設定清單。
動態偏好設定
動態偏好設定會使用 PreferenceGroup 代碼或 PreferenceGroup 的實作項目。
在 CarSettings 應用程式中,動態偏好設定代表一組一般偏好設定,可將使用者導向 CarSettings 中的其他頁面,但這些偏好設定是透過 Preference Controller 新增,而非在 XML 中新增。例如「語言與輸入設定」偏好設定下方的「管理鍵盤」偏好設定,會根據輸入法是否允許,動態將輸入法新增至偏好設定頁面。
動作列
每個設定畫面的頂端都有一個動作列,可包含「返回」導覽、畫面標題和附加動作小工具 (例如按鈕和切換鈕)。這些動作列類似於 Android 提供的 ActionBar,但實際上是自訂檢視區塊。在 Android 11 以上版本中,這個工具列會納入底盤基礎版面配置,其中包含工具列的檢視畫面,以及其他應用程式內容的框架版面配置。
附加動作小工具是 MenuItem 類別,應在各自 SettingsFragment
或 BaseFragment
的 onCreate
中建立。在 SettingsFragment
的商業邏輯中,應由 setter 控制可見度、狀態等屬性。
// ExampleSettingsFragment.java public class ExampleSettingsFragment extends SettingsFragment { @Override protected List<MenuItem> getToolbarMenuItems() { return Collections.singletonList(mClearConfirmButton); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mButton = new MenuItem.Builder(getContext()) .setTitle(R.string.text) .setOnClickListener(mOnClickListener) .setUxRestrictions(CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP) .build(); } private void updateState() { button.setVisible(false); } }
動作列支援車輛設定中的分心程度最佳化功能。在建立 MenuItem.Builder
時設定 UXRestrictions。
偏好設定控制器
每個設定頁面可容納多個不同的偏好設定。
請參閱下圖,瞭解這些元件之間的關聯:
圖 1. CarSettings 元件
PreferenceController
是生命週期感知元件,可協助封裝與特定偏好設定相關的業務邏輯。PreferenceControllers
只能透過 XML 附加至相關偏好設定。
// example_settings_fragment.xml <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:title="@string/example_settings_title"> <Preference android:key="@string/pk_example_preference_key" android:title="@string/example_preference_title" settings:controller="com.android.car.settings.example.ExamplePreferenceController"/> </PreferenceScreen>
Car Settings 會明確禁止透過程式碼建立 PreferenceController
,以便在對 Java 程式碼進行最少變更的情況下,更輕鬆地修改設定階層。
PreferenceController
可能需要一些動態資料才能正常運作。舉例來說,如果 PreferenceController
要關閉應用程式的通知,就必須知道要對哪個應用程式採取動作。由於 PreferenceControllers
一律會在 XML 中定義,因此無法提供額外的建構函式引數。相反地,這些額外值會透過 PreferenceController
上的公用 setter 提供,並使用 SettingsFragment
中的 use(...)
方法進行設定。
// ExamplePreferenceController.java public class ExamplePreferenceContorller extends PreferenceController<Preference> { private ExampleArg mExampleArg; public ExamplePreferenceController(...) { ... } public void setExampleArg(ExampleArg exampleArg) { mExampleArg = exampleArg; } } // ExampleSettingsFragment.java public class ExampleSettingsFragment extends SettingsFragment { @Override @XmlRes protected int getPreferenceScreenResId() { Return R.xml.example_settings_fragment; } @Override public void onAttach(Context context) { ExampleArg arg = (ExampleArg) getArguments().getSerializeable(ARG_KEY); ExamplePreferenceController controller = use(ExamplePreferenceController.class, R.string.pk_example_preference_key); controller.setExampleArg(arg); } }
使用 use(...)
方法的次數越多,就越難達成原先的目標,也就是在修改 Java 程式碼的情況下,重新排列設定階層,因為您必須將現有片段程式碼的大部分內容複製到新建立的片段。其中一種方法是:
- 盡量減少
use(...)
的用量。 - 請盡量將所有
use(...)
呼叫都放在片段中同一個位置 (例如onAttach()
方法中)。
意圖處理
所有應由 Car Settings 應用程式處理的意圖,皆已在資訊清單檔案中定義。意圖通常會像大多數標準 Android 應用程式一樣定義及處理,並在資訊清單中定義所有活動和意圖篩選器。
變更根片段
如有需要,您可以使用 config_show_settings_root_exit_icon
顯示或隱藏「Exit」圖示。
自訂主題
自訂其他屬性和資源
汽車設定應用程式主要使用 CarSettingTheme
,這是 Theme.CarUi
的擴充功能。這個主題可用於將系統應用程式的外觀和感受標準化,確保系統的一致性。
自訂偏好設定
自訂偏好設定涵蓋下列其他位置:
- 部分基本偏好設定類別的版面配置是在
car_preference
中定義,並在車輛版本中重疊。您可以在這裡取代任何基礎偏好設定類別的自訂版面配置。 - 汽車設定會使用
common
套件中定義的部分自訂偏好設定。這些偏好設定應在 Car Settings 模組中與基礎偏好設定類別分開顯示。