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:
- Dodawanie ustawień samochodu
- Zmienianie kolejności ustawień samochodu
- Minimalizacja liczby elementów rozpraszających uwagę w ustawieniach samochodu
- Indeksowanie wyszukiwania ustawień samochodu
- Personalizacja panelu podwójnego
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:
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 PreferenceController
za 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 metodachonAttach()
).
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.