車輛設定 (packages/apps/Car/Settings
) 是為
Android Automotive OS (AAOS)。車輛設定與手機設定不同
(packages/apps/Settings
)。雖然車輛設定包含一些大家熟悉的手機設定,
車輛設定提供車輛化的視覺使用者介面、讓駕駛人分心等級最佳化功能
以及許多原始設備製造商 (OEM) 的自訂進入點
除了下方提供的車輛設定總覽外,請參閱相關的 主題,進一步瞭解車輛設定:
架構與指南
「車輛設定」中的大部分頁面都以一系列片段實作
擴充 SettingsFragment,
CarSettingActivities。這些靜態活動是從 BaseCarSettingsActivity 擴充。雖然這項規則有一些例外狀況,例如一些擴充的特殊片段
BaseFragment (而非 SettingsFragment
),以及位於 CarSettingActivities 外的部分活動,這些活動都應視為例外狀況 (而非應遵循的模式)。
靜態偏好設定
靜態偏好設定是在 XML 中使用 Preference 值
或 CarUiPreference
標記之前。SettingsFragment
實作會使用 getPreferenceScreenResId()
方法,定義哪個 XML 檔案包含要顯示的靜態偏好設定清單。
動態偏好設定
動態偏好設定使用 PreferenceGroup 標記或 PreferenceGroup 實作。
在 CarSettings 應用程式中,動態偏好設定代表的是一組正常的 透過偏好設定將使用者導向 CarSettings 內的其他頁面,但 透過 [偏好設定] 中的 控制器,而不是在 XML 中。例如「管理鍵盤」 輸入偏好設定 (動態新增輸入內容) 方法,根據這些輸入法是否 允許或禁止。
動作列
每個設定畫面頂端都有動作列,可包含 「返回」導覽、畫面標題和補充的動作小工具 (例如 按鈕和切換按鈕)。這些動作列與 ActionBar 類似 但實際上是自訂檢視畫面在 Android 11 以上版本中 工具列包含在底座基本版面配置中,其中包含 和頁框版面配置。
補充動作小工具是 MenuItem 類別,應在
相應 SettingsFragment
的 onCreate
,或
BaseFragment
。顯示設定、狀態等屬性應該
由 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
中的 UX 限制。
偏好設定控制器
每個設定頁面可包含多個 偏好設定:
請參閱下圖,瞭解這些元件的關聯性:
圖 1. 車輛設定元件
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>
車輛設定已明確禁止建立 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()
方法中)。
意圖處理
所有意圖 應由「車輛設定」應用程式處理,詳情請參閱 資訊清單 檔案。意圖通常定義及處理,就像大多數標準 Android 應用程式一樣。 使用資訊清單中定義的所有活動和意圖篩選器。
變更根片段
如有需要,您可以使用 config_show_settings_root_exit_icon
顯示或隱藏「結束」圖示。
自訂主題
自訂其他屬性和資源
車輛設定應用程式主要使用 CarSettingTheme
。
這是 Theme.CarUi
的延伸。這個主題是用來標準化
確保系統應用程式的外觀和風格。
自訂偏好設定
自訂偏好設定適用於下列額外位置:
- 部分基本偏好設定類別的版面配置已定義於
car_preference
和疊加 車輛版本基本偏好設定類別的任何自訂版面配置可以是 在這裡。 - 車輛設定會使用主要在
common
套件。應在「車輛設定」模組中個別重疊, 基本偏好設定類別。