汽車設置 ( packages/apps/Car/Settings
) 是專門為 Android Automotive OS (AAOS) 提供的。汽車設置不同於電話設置( packages/apps/Settings
)。雖然 Car Settings 包含一些熟悉的電話設置,但 Car Settings 提供了汽車化的視覺用戶界面、駕駛員分心優化以及 OEM 的眾多自定義入口點。
除了下面提供的汽車設置概述外,請參閱這些相關主題以了解有關汽車設置的更多信息:
架構和指南
Car Settings 中的大多數頁面都實現為一系列擴展SettingsFragment的片段,每個片段在CarSettingActivities中定義了自己的活動。這些靜態活動是從BaseCarSettingsActivity擴展而來的。雖然這條規則有一些例外,例如一些特殊的 Fragment 擴展BaseFragment而不是SettingsFragment
和一些駐留在CarSettingActivities之外的活動,所有這些都應該被視為例外(而不是要遵循的模式)。
靜態首選項
使用Preference或CarUiPreference標籤在 XML 中定義靜態首選項。 SettingsFragment
實現使用getPreferenceScreenResId()
方法來定義哪個 XML 文件包含要顯示的首選項的靜態列表。
動態偏好
動態首選項使用PreferenceGroup > 標記或 PreferenceGroup 的實現(例如LogicalPreferenceGroup)來定義一組由Preference Controller生成和控制的首選項。
在 CarSettings 應用程序中,動態首選項表示一組正常的首選項,這些首選項將用戶引導到 CarSettings 中的其他頁面,但這些首選項是通過首選項控制器而不是 XML 中添加的。一個示例是語言和輸入首選項下的管理鍵盤首選項,它根據是否允許這些輸入法動態地將輸入法添加到首選項頁面。
動作條
每個設置屏幕的頂部都有一個操作欄,其中可以包含“返回”導航、屏幕標題和補充操作小部件(例如,按鈕和開關)。這些動作條類似於Android提供的ActionBar ,但實際上是自定義視圖。在 Android 11 及更高版本中,此工具欄包含在機箱基礎佈局中,其中包含工具欄的視圖和其餘應用程序內容的框架佈局。
補充動作小部件是 MenuItem 類,應在相應SettingsFragment
或BaseFragment
的onCreate
中創建。可見性、狀態等屬性應由 SettingsFragment 的業務邏輯中的SettingsFragment
器控制。
// 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。
偏好控制器
每個設置頁面可以包含許多不同的首選項。為了幫助維護代碼組織,每個首選項或一組相關的首選項都有一個與之關聯的PreferenceController 。
請參閱下圖了解這些組件之間的關係:
圖 1. CarSettings 組件
PreferenceController
是一個生命週期感知組件,有助於封裝與特定 Preferences 相關的業務邏輯。 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(...)
方法進行SettingsFragment
。
// 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 應用程序一樣定義和處理,所有活動和意圖過濾器都在清單中定義。
更改根片段
默認情況下,汽車設置會在應用啟動時顯示HomepageFragment
。這可以通過反轉config_is_quick_settings_root
、 config_enable_home_settings_icon
和config_enable_quick_settings_icon
的布爾值來配置為QuickSettingFragment
。
如果需要,可以使用config_show_settings_root_exit_icon
顯示或隱藏退出圖標。
自定義主題
自定義其他屬性和資源
Car Settings 應用程序主要使用CarSettingTheme
,它是Theme.CarUi
的擴展。此主題用於標準化系統應用程序的外觀,以確保系統的一致性。
自定義首選項
自定義首選項跨越這些額外的位置:
- 一些基本偏好類的佈局在
car_preference
中定義,並為汽車構建覆蓋。基本首選項類的任何自定義佈局都可以在此處替換。 - Car Settings 使用一些主要在
common
包中定義的自定義首選項。這些應該與基本首選項類分開覆蓋在汽車設置模塊中。