Przegląd

Ustawienia samochodu (packages/apps/Car/Settings) są dostępne tylko w systemie operacyjnym Android Automotive (AAOS). Ustawienia samochodu różnią się od ustawień telefonu (packages/apps/Settings). Ustawienia samochodu zawierają niektóre znane ustawienia telefonu, ale oferują też specjalnie zaprojektowany interfejs użytkownika, optymalizowany pod kątem rozpraszania uwagi kierowcy, a także wiele punktów wejścia do spersonalizowanych ustawień dla producentów OEM.

Oprócz ogólnych informacji o Ustawieniach samochodu, które znajdziesz poniżej, zapoznaj się z tymi powiązanymi tematami, aby dowiedzieć się więcej o Ustawieniach samochodu:

Architektura i wytyczne

Większość stron w Ustawieniach samochodu jest implementowana jako seria fragmentów, które rozszerzają klasę SettingsFragment. Każdy z nich ma własne działanie zdefiniowane w klasie CarSettingActivities. Te statyczne aktywności są rozszerzeniem aktywności BaseCarSettingsActivity. Istnieją jednak pewne wyjątki od tej reguły, takie jak niektóre fragmenty specjalne rozszerzające BaseFragment, a nie SettingsFragment, oraz niektóre czynności znajdujące się poza CarSettingActivities. Wszystkie te wyjątki należy traktować jako wyjątki (a nie wzorce do naśladowania).

Ustawienia statyczne

Ustawienie statyczne jest definiowane w pliku XML za pomocą tagu Preference lub CarUiPreference. W implementacji SettingsFragment metoda getPreferenceScreenResId() określa, który plik XML zawiera stałą listę preferencji do wyświetlenia.

Dynamiczne ustawienia

Preferencje dynamiczne korzystają z tagu PreferenceGroup lub implementacji interfejsu PreferenceGroup.

W aplikacji CarSettings dynamiczne ustawienia to normalny zestaw ustawień, które kierują użytkownika na dodatkowe strony w CarSettings, ale zostały dodane za pomocą elementu PreferenceController, a nie w pliku XML. Przykładem jest ustawienie Zarządzaj klawiaturami w sekcji Ustawienia języka i wprowadzania tekstu, które dynamicznie dodaje metody wprowadzania do strony ustawień w zależności od tego, czy są one dozwolone.

Paski działań

Górna część każdego ekranu ustawień zawiera pasek działań, na którym mogą znajdować się przyciski „Wstecz”, tytuł ekranu oraz dodatkowe widżety działań (np. przyciski i przełączniki). Te paski działań są podobne do ActionBar w Androidzie, ale są w istocie widokami niestandardowymi. W Androidzie 11 i nowszych ta belkę narzędzi zawiera układ bazowy podwozia, który zawiera widoki dla tej belki narzędzi oraz układ ramki dla reszty treści aplikacji.

Dodatkowe widżety działań to klasy MenuItem, które należy utworzyć w onCreate odpowiedniego elementu SettingsFragment lub BaseFragment. Właściwości takie jak widoczność, stan itp. powinny być kontrolowane przez metody settera w logice biznesowej klasy 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);
    }
}

Paski działań obsługują optymalizację w ustawieniach samochodu w zakresie rozpraszania uwagi. Podczas tworzenia ustaw ograniczenia UX w MenuItem.Builder.

Elementy sterujące preferencjami

Na każdej stronie ustawień może być wiele różnych preferencji.

Na poniższym obrazku widać, jak te komponenty są ze sobą powiązane:

Komponenty CarSettings

Rysunek 1. Komponenty CarSettings

PreferenceController to komponent uwzględniający cykl życia, który pomaga ująć logikę biznesową związaną z określonymi preferencjami. PreferenceControllers można dołączyć do odpowiedniej preferencji tylko za pomocą pliku 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>

Ustawienia samochodu wyraźnie uniemożliwiają tworzenie PreferenceControllerza pomocą kodu, aby ułatwić modyfikowanie hierarchii ustawień przy minimalnych zmianach w kodzie Java.

Możliwe, że PreferenceController potrzebuje danych dynamicznych, aby działać prawidłowo. Na przykład PreferenceController, który wyłącza powiadomienia z aplikacji, musi wiedzieć, z której aplikacji ma je wyłączyć. Ponieważ PreferenceControllers są zawsze definiowane w XML, nie ma możliwości podania dodatkowych argumentów konstruktora. Zamiast tego te dodatkowe wartości są podawane za pomocą publicznych metod ustawiania w klasie PreferenceController i ustawiane za pomocą metody use(...) w klasie 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);
  }
}

Im częściej używana jest metoda use(...), tym trudniej jest zachować pierwotny cel, czyli możliwość zmiany hierarchii ustawień przy minimalnych zmianach w kodzie Java, ponieważ duże fragmenty kodu muszą być kopiowane do nowo utworzonego fragmentu. Aby ułatwić sobie to zadanie, możesz:

  • Zminimalizuj użycie use(...).
  • Staraj się, aby każde wywołanie funkcji use(...) było w jednym miejscu w fragmentach kodu (np. w metodach onAttach()).

Obsługa intencji

Wszystkie zamiary, które powinny być obsługiwane przez aplikację Ustawienia samochodu, są zdefiniowane w pliku manifestu. Intencje są definiowane i obsługiwane podobnie jak większość standardowych aplikacji na Androida, ze wszystkimi działaniami i filtrami intencji zdefiniowanymi w pliku manifestu.

Zmień fragment główny

W razie potrzeby ikonę wyjścia można wyświetlić lub ukryć, używając config_show_settings_root_exit_icon.

Dostosowywanie motywu

dostosowywanie innych atrybutów i zasobów;

Aplikacja Ustawienia samochodu korzysta głównie z usługi CarSettingTheme, która jest rozszerzeniem usługi Theme.CarUi. Ten motyw służy do standaryzacji wyglądu i działania aplikacji systemowych w celu zapewnienia spójności systemu.

Dostosowywanie ustawień

Ustawienia dostosowywania obejmują te dodatkowe lokalizacje:

  • Układ niektórych podstawowych klas preferencji jest zdefiniowany w pliku car_preference, a nakładany w przypadku wersji samochodowych. Tutaj możesz zastąpić dowolne układy dostosowywania dla podstawowych klas preferencji.
  • Ustawienia samochodu korzystają z niektórych niestandardowych ustawień zdefiniowanych głównie w pakiecie common. Powinny one być nakładane w module ustawień samochodu oddzielnie od podstawowych klas preferencji.