汽車設定 ( packages/apps/Car/Settings
) 是專門為 Android Automotive OS (AAOS) 提供的。汽車設定與電話設定( packages/apps/Settings
)不同。雖然「汽車設定」包含一些熟悉的手機設置,但「汽車設定」為 OEM 提供了汽車化的視覺用戶介面、駕駛員分心優化以及眾多客製化入口點。
除了下面提供的汽車設定概述之外,請參閱以下相關主題以了解有關汽車設定的更多資訊:
架構和指南
汽車設定中的大多數頁面都是作為一系列擴展SettingsFragment 的片段實現的,每個片段都有自己在CarSettingActivities中定義的活動。這些靜態活動是從BaseCarSettingsActivity擴展的。雖然此規則有一些例外,例如一些擴展BaseFragment而不是SettingsFragment
特殊片段以及駐留在CarSettingActivities之外的一些 Activity,所有這些都應被視為例外(而不是要遵循的模式)。
靜態偏好
靜態首選項是使用Preference或CarUiPreference標記在 XML 中定義的。 SettingsFragment
實作使用getPreferenceScreenResId()
方法來定義哪個 XML 檔案包含要顯示的首選項的靜態清單。
動態偏好
動態首選項使用PreferenceGroup標籤或 PreferenceGroup 的實作。
在 CarSettings 應用程式中,動態首選項代表一組正常的首選項,可將使用者引導至 CarSettings 中的其他頁面,但這些頁面是透過首選項控制器而不是 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 附加到相關的 Preference。
// 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
,以便更輕鬆地修改 Settings 層次結構,同時對 Java 程式碼進行最少的變更。
PreferenceController
可能需要一些動態資料才能正確運作。例如,關閉應用程式通知的PreferenceController
需要知道要對哪個應用程式執行操作。由於PreferenceControllers
始終在 XML 中定義,因此無法提供額外的建構子參數。相反,這些附加價值是透過PreferenceController
上的公共設定器提供的,並使用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()
方法中)。
意圖處理
汽車設定應用程式應處理的所有意圖均在清單檔案中定義。意圖通常像大多數標準 Android 應用程式一樣定義和處理,所有活動和意圖過濾器都在清單中定義。
更改根片段
如果需要,可以使用config_show_settings_root_exit_icon
顯示或隱藏退出圖示。
自訂主題
自訂其他屬性和資源
汽車設定應用程式主要使用CarSettingTheme
,它是Theme.CarUi
的擴充。此主題用於標準化系統應用程式的外觀,以確保系統的一致性。
自訂偏好設定
自訂首選項跨越以下其他位置:
- 一些基本首選項類別的佈局在
car_preference
中定義並覆蓋汽車構建。基本首選項類別的任何自訂佈局都可以在此處替換。 - 汽車設定使用主要在
common
包中定義的一些自訂首選項。這些應該與基本偏好類別分開覆蓋在汽車設定模組中。