Ringkasan

Setelan Mobil (packages/apps/Car/Settings) disediakan khusus untuk Android Automotive OS (AAOS). Setelan Mobil berbeda dengan Setelan Ponsel (packages/apps/Settings). Meskipun Setelan Mobil berisi beberapa setelan ponsel yang sudah dikenal, Setelan Mobil menyediakan antarmuka pengguna visual mobil, pengoptimalan gangguan pengemudi, dan sejumlah titik entri penyesuaian untuk OEM.

Selain ringkasan Setelan Mobil yang diberikan di bawah, lihat topik terkait ini untuk mempelajari Setelan Mobil lebih lanjut:

Arsitektur dan panduan

Sebagian besar halaman di Setelan Mobil diterapkan sebagai serangkaian fragmen yang memperluas SettingsFragment, masing-masing memiliki aktivitasnya sendiri yang ditentukan dalam CarSettingActivities. Aktivitas statis ini diperluas dari BaseCarSettingsActivity. Meskipun ada beberapa pengecualian untuk aturan ini, seperti beberapa fragmen khusus yang memperluas BaseFragment, bukan SettingsFragment, dan beberapa Aktivitas yang berada di luar CarSettingActivities, semuanya harus dianggap sebagai pengecualian (bukan sebagai pola yang harus diikuti).

Preferensi statis

Preferensi statis ditentukan dalam XML menggunakan tag Preference atau CarUiPreference. Implementasi SettingsFragment menggunakan metode getPreferenceScreenResId() untuk menentukan file XML mana yang berisi daftar preferensi statis yang akan ditampilkan.

Preferensi dinamis

Preferensi dinamis menggunakan tag PreferenceGroup atau implementasi PreferenceGroup.

Dalam aplikasi CarSettings, preferensi dinamis mewakili kumpulan preferensi normal yang mengarahkan pengguna ke halaman tambahan dalam CarSettings, tetapi telah ditambahkan melalui Preference Controller, bukan dalam XML. Contohnya adalah preferensi Kelola keyboard di bagian preferensi Bahasa & Input yang secara dinamis menambahkan metode input ke halaman preferensi berdasarkan apakah metode input ini diizinkan atau tidak.

Panel tindakan

Bagian atas setiap layar setelan memiliki panel tindakan, yang dapat berisi navigasi "kembali", judul layar, dan widget tindakan tambahan (misalnya, tombol dan tombol akses). Panel tindakan ini mirip dengan ActionBar yang disediakan oleh Android, tetapi sebenarnya merupakan tampilan kustom. Di Android 11 dan yang lebih baru, toolbar ini disertakan dalam tata letak dasar sasis, yang berisi tampilan untuk toolbar dan framelayout untuk konten aplikasi lainnya.

Widget tindakan tambahan adalah class MenuItem dan harus dibuat di onCreate dari SettingsFragment atau BaseFragment masing-masing. Properti seperti visibilitas, status, dan sebagainya harus dikontrol oleh penyetel dalam logika bisnis 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);
    }
}

Panel tindakan dilengkapi dengan dukungan untuk Pengoptimalan Gangguan di Setelan Mobil. Tetapkan UXRestrictions di MenuItem.Builder saat pembuatan.

Pengontrol preferensi

Setiap halaman setelan dapat menyimpan sejumlah Preferensi.

Lihat gambar berikut untuk mengetahui hubungan komponen ini:

Komponen CarSettings

Gambar 1. Komponen CarSettings

PreferenceController adalah komponen berbasis siklus proses yang membantu mengekapsulasi logika bisnis yang berkaitan dengan Preferensi tertentu. PreferenceControllers hanya dapat dilampirkan ke Preferensi yang relevan melalui 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>

Setelan Mobil secara eksplisit mencegah pembuatan PreferenceController melalui kode untuk mempermudah modifikasi hierarki Setelan dengan perubahan minimal pada kode Java.

Mungkin PreferenceController memerlukan beberapa data dinamis agar dapat beroperasi dengan benar. Misalnya, PreferenceController yang menonaktifkan notifikasi untuk aplikasi perlu mengetahui aplikasi mana yang akan ditindaklanjuti. Karena PreferenceControllers selalu ditentukan dalam XML, tidak ada cara untuk memberikan argumen konstruktor tambahan. Sebagai gantinya, nilai tambahan ini disediakan melalui penyetel publik di PreferenceController dan ditetapkan menggunakan metode use(...) dari SettingsFragment.

// 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);
  }
}

Makin sering metode use(...) digunakan, makin sulit untuk mempertahankan tujuan awal agar dapat mengatur ulang hierarki setelan dengan perubahan minimal pada kode Java, karena sebagian besar kode fragmen yang ada perlu disalin ke fragmen yang baru dibuat. Salah satu cara untuk meminimalkan kesulitan dalam melakukannya adalah dengan:

  • Minimalkan penggunaan use(...).
  • Cobalah untuk menyimpan setiap panggilan ke use(...) di satu tempat dalam fragmen (misalnya, dalam metode onAttach()).

Penanganan intent

Semua intent yang harus ditangani oleh aplikasi Setelan Mobil ditentukan dalam file manifes. Intent umumnya ditentukan dan ditangani seperti sebagian besar aplikasi Android standar, dengan semua aktivitas dan filter intent yang ditentukan dalam manifes.

Mengubah fragmen root

Jika diinginkan, ikon Keluar dapat ditampilkan atau disembunyikan menggunakan config_show_settings_root_exit_icon.

Menyesuaikan tema

Menyesuaikan atribut dan resource lainnya

Aplikasi Setelan Mobil terutama menggunakan CarSettingTheme, yang merupakan ekstensi dari Theme.CarUi. Tema ini digunakan untuk menstandarkan tampilan dan nuansa aplikasi sistem untuk memastikan konsistensi dalam sistem.

Menyesuaikan preferensi

Penyesuaian preferensi mencakup lokasi tambahan berikut:

  • Tata letak beberapa class preferensi dasar ditentukan di car_preference dan ditumpangkan untuk build mobil. Setiap tata letak penyesuaian untuk class preferensi dasar dapat diganti di sini.
  • Setelan Mobil menggunakan beberapa preferensi kustom yang ditentukan terutama dalam paket common. Preferensi ini harus ditempatkan dalam modul Setelan Mobil secara terpisah dari class preferensi dasar.