概要

車の設定(packages/apps/Car/Settings)は、Android Automotive OS(AAOS)専用のものです。車の設定はスマートフォンの設定(packages/apps/Settings)とは異なります。車の設定には、スマートフォンでなじみのある設定がいくつか含まれていますが、それ以外にも、車で使用される視覚的なユーザー インターフェース、ドライバーの注意散漫に対する最適化、OEM 向けの多数のカスタム エントリ ポイントも用意されています。

以下に示す車の設定の概要に加えて、車の設定の詳細については次の関連トピックをご覧ください。

アーキテクチャとガイドライン

[車の設定] のほとんどのページは、SettingsFragment を拡張する一連のフラグメントとして実装され、各フラグメントには CarSettingActivities で定義された独自のアクティビティがあります。これらの静的アクティビティは、BaseCarSettingsActivity から拡張されます。ただし、SettingsFragment ではなく BaseFragment を拡張する特別なフラグメントや、CarSettingActivities の外部にあるアクティビティなど、このルールにはいくつかの例外があります。これらすべてを(従うパターンではなく)例外として扱う必要があります。

静的設定

静的設定は、XML で Preference タグまたは CarUiPreference タグを使用して定義されます。SettingsFragment 実装では、表示する設定の静的リストを含む XML ファイルの定義に getPreferenceScreenResId() メソッドが使用されます。

動的設定

動的設定では、PreferenceGroup タグまたは PreferenceGroup の実装(LogicalPreferenceGroup など)を使用して、設定コントローラによって生成および制御される設定のセットを定義します。

CarSettings アプリ内の動的設定は、ユーザーを CarSettings 内の追加ページに誘導する設定の通常のセットを表しますが、XML ではなく設定コントローラを介して追加されています。たとえば、[言語と入力] 設定の [キーボードを管理] 設定では、これらの入力方法が許可されているかどうかに基づいて、入力方法を設定ページに動的に追加します。

アクションバー

各設定画面の最上部にはアクションバーがあります。「戻る」ナビゲーション、画面タイトル、補助的なアクション ウィジェット(ボタンやスイッチなど)を配置できます。これらのアクションバーは Android に備えられた ActionBar に類似していますが、実際はカスタムビューです。Android 11 以降では、このツールバーはシャーシのベース レイアウトに配置されており、ツールバーのビューと、アプリの残りの部分のフレーム レイアウトが含まれています。

補助アクション ウィジェットは MenuItem クラスであり、それぞれの SettingsFragment または BaseFragmentonCreate で作成する必要があります。可視性や状態などのプロパティは、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 が関連付けられています。

これらのコンポーネントの関係については、次の画像をご覧ください。

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>

車の設定を使用すると、Java コードの変更を最小限に抑えたまま設定階層を簡単に変更できるように、コードによる PreferenceController の作成を明示的に防止できます。

PreferenceController が正しく動作するために、いくつかの動的データが必要になる場合があります。たとえば、アプリの通知をオフにする PreferenceController は、処理対象のアプリを認識する必要があります。PreferenceControllers は常に XML で定義されるため、追加のコンストラクタ引数を指定する方法はありません。代わりに、それらの追加値を PreferenceController でパブリック セッターを介して指定し、SettingsFragmentuse(...) メソッドを使用して設定します。

// 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(...) の呼び出しはすべて、フラグメント内の 1 か所(onAttach() メソッドなど)に保持する。

インテントの処理

車設定アプリで処理する必要があるすべてのインテントは、マニフェスト ファイルで定義されています。インテントは、通常は大部分の標準の Android アプリと同様に定義および処理され、マニフェストで定義されたすべてのアクティビティとインテント フィルタが使用されます。

ルート フラグメントの変更

デフォルトでは、アプリを起動すると、車の設定に HomepageFragment が表示されます。これは、config_is_quick_settings_rootconfig_enable_home_settings_iconconfig_enable_quick_settings_icon のブール値を反転することで QuickSettingFragment として構成できます。

必要に応じて、config_show_settings_root_exit_icon を使用して終了アイコンの表示と非表示を切り替えることができます。

テーマのカスタマイズ

他の属性とリソースのカスタマイズ

車設定アプリは主に Theme.CarUi の拡張である CarSettingTheme を使用します。このテーマは、システムの整合性を確保するために、システムアプリのデザインを標準化するために使用されます。

設定のカスタマイズ

設定のカスタマイズは次の場所に適用されます。

  • 一部の基本設定クラスのレイアウトは car_preference で定義され、自動車ビルド用にオーバーレイされます。基本設定クラスのカスタマイズ レイアウトはここで置き換えることができます。
  • 車の設定では、主に common パッケージで定義されたカスタム設定を使用します。これらは、基本設定クラスとは別に、車設定モジュール内にオーバーレイする必要があります。