總覽

車輛設定 (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。

偏好設定控制器

每個設定頁面可容納多個不同的偏好設定。

請參閱下圖,瞭解這些元件之間的關聯:

CarSettings 元件

圖 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 模組中與基礎偏好設定類別分開顯示。