總覽

汽車設定 ( packages/apps/Car/Settings ) 是專門為 Android Automotive OS (AAOS) 提供的。汽車設定與電話設定( packages/apps/Settings )不同。雖然「汽車設定」包含一些熟悉的手機設置,但「汽車設定」為 OEM 提供了汽車化的視覺用戶介面、駕駛員分心優化以及眾多客製化入口點。

除了下面提供的汽車設定概述之外,請參閱以下相關主題以了解有關汽車設定的更多資訊:

架構和指南

汽車設定中的大多數頁面都是作為一系列擴展SettingsFragment 的片段實現的,每個片段都有自己在CarSettingActivities中定義的活動。這些靜態活動是從BaseCarSettingsActivity擴展的。雖然此規則有一些例外,例如一些擴展BaseFragment而不是SettingsFragment特殊片段以及駐留在CarSettingActivities之外的一些 Activity,所有這些都應被視為例外(而不是要遵循的模式)。

靜態偏好

靜態首選項是使用PreferenceCarUiPreference標記在 XML 中定義的。 SettingsFragment實作使用getPreferenceScreenResId()方法來定義哪個 XML 檔案包含要顯示的首選項的靜態清單。

動態偏好

動態首選項使用PreferenceGroup標籤或 PreferenceGroup 的實作。

在 CarSettings 應用程式中,動態首選項代表一組正常的首選項,可將使用者引導至 CarSettings 中的其他頁面,但這些頁面是透過首選項控制器而不是 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。

偏好控制器

每個設定頁面可以包含許多不同的首選項

請參閱下圖以了解這些組件的關係:

汽車設定組件

圖 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包中定義的一些自訂首選項。這些應該與基本偏好類別分開覆蓋在汽車設定模組中。