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:
- Dodawanie ustawień samochodu
- Zmiana ustawień samochodu
- Optymalizacja rozproszenia uwagi w ustawieniach samochodu
- Indeksowanie wyszukiwania ustawień samochodu
- Personalizacja podwójnego panelu
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:
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 metodzieonAttach()
).
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.