Przegląd

Ustawienia samochodu ( packages/apps/Car/Settings ) są dostarczane specjalnie dla systemu operacyjnego Android Automotive (AAOS). Ustawienia samochodu różnią się od ustawień telefonu ( packages/apps/Settings ). Chociaż Ustawienia samochodu zawierają pewne znane ustawienia telefonu, Ustawienia samochodu zapewniają wizualny interfejs użytkownika dostosowany do samochodu , optymalizacje rozpraszające uwagę kierowcy i liczne punkty wejścia do dostosowywania dla producentów OEM.

Oprócz przeglądu ustawień samochodu przedstawionego poniżej, zapoznaj się z powiązanymi tematami, aby dowiedzieć się więcej o ustawieniach samochodu:

Architektura i wytyczne

Większość stron w Car Settings jest zaimplementowana jako seria fragmentów rozszerzających SettingsFragment , z których każdy ma własną aktywność zdefiniowaną w CarSettingActivities . Te statyczne działania są rozszerzone z BaseCarSettingsActivity . Chociaż istnieje kilka wyjątków od tej reguły, takich jak niektóre specjalne fragmenty rozszerzające BaseFragment zamiast SettingsFragment i niektóre działania znajdujące się poza CarSettingActivities , wszystkie z nich należy traktować jako wyjątki (a nie wzorce do naśladowania).

Preferencje statyczne

Preferencje statyczne są definiowane w formacie XML przy użyciu znacznika Preference lub CarUiPreference . Implementacja SettingsFragment wykorzystuje metodę getPreferenceScreenResId() do zdefiniowania, który plik XML zawiera statyczną listę preferencji do wyświetlenia.

Preferencje dynamiczne

Preferencje dynamiczne korzystają ze znacznika PreferenceGroup lub implementacji PreferenceGroup.

W aplikacji CarSettings preferencje dynamiczne reprezentują normalny zestaw preferencji, które kierują użytkownika do dodatkowych stron w ramach CarSettings, ale które zostały dodane za pośrednictwem kontrolera preferencji , a nie w formacie XML. Przykładem jest preferencja Zarządzaj klawiaturami w obszarze Preferencje Języki i wprowadzanie, która dynamicznie dodaje metody wprowadzania do strony preferencji w zależności od tego, czy te metody wprowadzania są dozwolone, czy nie.

Paski akcji

U góry każdego ekranu ustawień znajduje się pasek akcji, który może zawierać nawigację „wstecz”, tytuł ekranu i dodatkowe widżety akcji (na przykład przyciski i przełączniki). Te paski akcji są podobne do paska akcji dostępnego w systemie Android, ale w rzeczywistości są widokami niestandardowymi. W systemie Android 11 i nowszych wersjach ten pasek narzędzi jest zawarty w układzie podstawowym obudowy, który zawiera widoki paska narzędzi i układ ramek dla pozostałej zawartości aplikacji.

Dodatkowe widżety akcji to klasy MenuItem i należy je utworzyć w onCreate odpowiedniego SettingsFragment lub BaseFragment . Właściwości takie jak widoczność, stan itd. powinny być kontrolowane przez elementy ustawiające w logice biznesowej 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 akcji obsługują optymalizację rozproszenia w ustawieniach samochodu . Ustaw UXRestrictions w MenuItem.Builder podczas tworzenia.

Kontrolery preferencji

Każda strona ustawień może zawierać wiele różnych Preferencji .

Zobacz poniższą ilustrację, aby zobaczyć, jak te komponenty są ze sobą powiązane:

Komponenty ustawień samochodu

Rysunek 1. Komponenty CarSettings

PreferenceController to komponent uwzględniający cykl życia, który pomaga hermetyzować logikę biznesową odnoszącą się do określonych preferencji. PreferenceControllers można dołączyć do odpowiednich preferencji wyłącznie za pomocą formatu 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ą utworzenie PreferenceController za pomocą kodu, aby ułatwić modyfikowanie hierarchii ustawień przy minimalnych zmianach w kodzie Java.

Możliwe, że PreferenceController potrzebuje pewnych danych dynamicznych do prawidłowego działania. Na przykład PreferenceController , który wyłącza powiadomienia dla aplikacji, musi wiedzieć, w której aplikacji ma działać. Ponieważ PreferenceControllers są zawsze zdefiniowane w formacie XML, nie ma możliwości podania dodatkowych argumentów konstruktora. Zamiast tego te dodatkowe wartości są dostarczane za pośrednictwem publicznych metod ustawiających w PreferenceController i ustawiane przy użyciu metody use(...) z 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 stosowana jest metoda use(...) , tym trudniej jest utrzymać pierwotny cel, jakim jest możliwość zmiany układu hierarchii ustawień przy minimalnych zmianach w kodzie Java, ponieważ duże sekcje istniejącego fragmentu kodu muszą zostać skopiowany do nowo utworzonego fragmentu. Jednym ze sposobów zminimalizowania trudności jest:

  • Minimalizuj użycie use(...) .
  • Staraj się, aby każde wywołanie use(...) znajdowało się w jednym miejscu fragmentu (na przykład w metodzie onAttach() ).

Obsługa intencji

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

Zmień fragment główny

W razie potrzeby ikonę wyjścia można wyświetlić lub ukryć za pomocą config_show_settings_root_exit_icon .

Dostosuj motyw

Dostosuj inne atrybuty i zasoby

Aplikacja Car Settings korzysta głównie z CarSettingTheme , który jest rozszerzeniem Theme.CarUi . Ten motyw służy do standaryzacji wyglądu i działania aplikacji systemowych, aby zapewnić spójność w systemie.

Dostosuj preferencje

Dostosowywanie preferencji obejmuje następujące dodatkowe lokalizacje:

  • Układ niektórych podstawowych klas preferencji jest zdefiniowany w car_preference i nałożony na kompilacje samochodów. W tym miejscu można zastąpić dowolne układy dostosowywania dla podstawowych klas preferencji.
  • Ustawienia samochodu korzystają z niektórych niestandardowych preferencji zdefiniowanych głównie we common pakiecie. Powinny one zostać nałożone w module Ustawienia samochodu oddzielnie od podstawowych klas preferencji.