總覽

車輛設定 (packages/apps/Car/Settings) 專為 Android Automotive OS (AAOS) 提供。車輛設定與手機設定 (packages/apps/Settings) 不同。雖然車輛設定包含一些熟悉的手機設定,但也提供汽車化的視覺使用者介面、最佳化駕駛員分心程度,以及許多原始設備製造商 (OEM) 自訂進入點。

除了下方提供的「車輛設定」總覽,請參閱下列相關主題,進一步瞭解「車輛設定」:

架構和指南

車輛設定中的大部分頁面都會以一系列延伸自 SettingsFragment 的片段實作,每個頁面都有在 CarSettingActivities 中定義的專屬活動。這些靜態活動是從 BaseCarSettingsActivity 擴充而來。不過,此規則有幾個例外狀況,例如某些特殊的元件會擴充 BaseFragment 而非 SettingsFragment,以及位於 CarSettingActivities 外部的某些活動,這些都應視為例外狀況 (而非可遵循的模式)。

靜態偏好設定

您可以使用 PreferenceCarUiPreference 標記,在 XML 中定義靜態偏好設定。SettingsFragment 實作會使用 getPreferenceScreenResId() 方法,定義哪個 XML 檔案包含要顯示的靜態偏好設定清單。

動態偏好設定

動態偏好設定會使用 PreferenceGroup 代碼或 PreferenceGroup 的實作項目。

在 CarSettings 應用程式中,動態偏好設定代表一組一般偏好設定,可將使用者導向 CarSettings 中的其他頁面,但這些偏好設定是透過 Preference Controller 新增,而非在 XML 中新增。例如「語言與輸入設定」偏好設定下方的「管理鍵盤」偏好設定,會根據輸入法是否允許,動態將輸入法新增至偏好設定頁面。

動作列

每個設定畫面的頂端都有一個動作列,可包含「返回」導覽、畫面標題和附加動作小工具 (例如按鈕和切換鈕)。這些動作列類似於 Android 提供的 ActionBar,但實際上是自訂檢視區塊。在 Android 11 以上版本中,這個工具列會納入底盤基礎版面配置,其中包含工具列的檢視畫面,以及其他應用程式內容的框架版面配置。

附加動作小工具是 MenuItem 類別,應在各自 SettingsFragmentBaseFragmentonCreate 中建立。在 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 模組中與基礎偏好設定類別分開顯示。