Większość stron w Ustawieniach samochodu jest implementowana jako seria fragmentów, które rozszerzają SettingsFragment
. Każdy z nich ma swoją własną aktywność zdefiniowaną w CarSettingActivities
.
Te statyczne aktywności są rozszerzeniem BaseCarSettingsActivity
.
Oprócz tych ustawień możesz też wstrzyknąć ustawienia z innych aplikacji systemowych, aby były widoczne w CarSettings.
Dodawanie nowej preferencji w ustawieniach samochodu
Aby dodać nowe ustawienie:
- Zdefiniuj plik XML:
- Upewnij się, że wszystkie preferencje mają zdefiniowane
android:key
. Lista kluczy jest przechowywana wpreference_keys.xml
. Klucze preferencji powinny być niepowtarzalne. - Na potrzeby indeksowania w wyszukiwarce ekrany ustawień powinny mieć zdefiniowany
android:key
. Lista klawiszy ekranu ustawień jest aktualizowana wpreference_screen_keys.xml
. Klucze ekranu ustawień powinny być też unikalne. - Jeśli ustawienie wyświetla tylko informacje statyczne (np. bez specjalnej logiki biznesowej), ustaw kontroler ustawień na wartość
com.android.car.settings.common.DefaultRestrictionsPreferenceController
. - Jeśli preferencja wymaga logiki biznesowej, ustaw kontroler preferencji za pomocą nowej nazwy kontrolera preferencji.
- Upewnij się, że wszystkie preferencje mają zdefiniowane
- (w razie potrzeby) Utwórz kontroler preferencji w odpowiednim pakiecie, który rozszerza klasę
PreferenceController
. W razie potrzeby zapoznaj się z dokumentacją Javadoc. - Utwórz fragment z
getPreferenceScreenResId
zwracający plik XML zdefiniowany w kroku 1. - Utwórz w
CarSettingActivities
aktywność rozszerzającąBaseCarSettingsActivity
, a potem zaimplementujgetInitialFragment()
, zwracając fragment zdefiniowany w kroku 3. - Zaktualizuj
AndroidManifest.xml
, aby uwzględnić aktywność zdefiniowaną w kroku 4.
Przykład
Ten materiał obrazuje ten proces.
- Zdefiniuj plik XML o nazwie
demo_fragment.xml
:<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:title="@string/demo_label" android:key="@string/psk_demo"> <Preference android:icon="@drawable/ic_settings_demo_preference_1" android:key="@string/pk_demo_preference_1" android:title="@string/demo_preference_1_title" settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"> <intent android:targetPackage="com.android.car.settings" android:targetClass="com.android.car.settings.common.CarSettingActivities$DemoSetting1Activity"/> </Preference> <Preference android:icon="@drawable/ic_settings_demo_preference_2" android:key="@string/pk_demo_preference_2" android:title="@string/demo_preference_2_title" settings:controller="com.android.car.settings.example.MyCustomRestrictionsPreferenceController"> <intent android:targetPackage="com.android.car.settings" android:targetClass="com.android.car.settings.common.CarSettingActivities$DemoSetting2Activity"/> </Preference> </PreferenceScreen>
- Dodaj klucze preferencji do
preference_keys
:<resources> [...] <string name="pk_demo_preference_1" translatable="false">demo_preference_1</string> <string name="pk_demo_preference_2" translatable="false">demo_preference_2</string> </resources>
- Dodaj klucz ekranu ustawień do
preference_screen_keys.xml
:<resources> [...] <string name="psk_demo" translatable="false">demo_screen</string> </resources>
W przypadku pierwszego przykładu ustawienia użyj wartości
DefaultRestrictionsPreferenceController
. W drugim przypadku użyj niestandardowego kontrolera preferencji, który musi zostać zdefiniowany. W tym przykładzie możesz dostosować tę opcję tylko do dostępnych użytkowników z rolą administratora. Aby to zrobić, zdefiniuj ten kontroler niestandardowy:public class MyCustomRestrictionsPreferenceController extends PreferenceController<Preference> { private final UserManager mUserManager; public MyCustomRestrictionsPreferenceController(Context context, String preferenceKey, FragmentController fragmentController, CarUxRestrictions uxRestrictions) { super(context, preferenceKey, fragmentController, uxRestrictions); mUserManager = UserManager.get(context); } @Override protected Class<Preference> getPreferenceType() { return Preference.class; } @Override public int getAvailabilityStatus() { return mUserManager.isAdminUser() ? AVAILABLE : DISABLED_FOR_USER; } }
- Aby utworzyć fragment, zastąpij
getPreferenceScreenResId
: - Aby utworzyć nowy fragment, utwórz aktywność w sekcji
CarSettingActivities
: - Zaktualizuj plik manifestu, dodając nową aktywność:
- nie jest bezpośrednio implementowana w aplikacji Ustawienia samochodu (np. poprzez wstrzyknięcie ustawienia zaimplementowanego przez producenta OEM);
- Powinien pojawić się w aplikacji Ustawienia samochodu.
- Aby oznaczyć działanie jako wstrzyknięte ustawienie, dodaj do niego filtr intencji.
- Powiedz aplikacji CarSettings, do której kategorii należy. Kategoria jest stałą wartością zdefiniowaną w
CategoryKey
i służy do wskazania, na jakim poziomie CarSettings ma się pojawić wstrzyknięte ustawienie. Udostępniamy zestaw kategorii w ramachCategoryKey
, ale nie ma żadnych ograniczeń dotyczących definiowania własnych kategorii przez producentów OEM. - (opcjonalnie) Dodaj tekst podsumowania, który będzie wyświetlany po wybraniu danego ustawienia:
<activity android:name="Settings$DemoSettingsActivity" <!-- Mark the activity as an injected setting --> <intent-filter> <action android:name="com.android.settings.action.EXTRA_SETTINGS"/> </intent-filter> <!-- Tell CarSettings app which category it belongs to --> <meta-data android:name="com.android.settings.category" android:value="com.android.settings.category.demo_category"/> <!-- Tell CarSettings the what the preference title should be --> <meta-data android:name="com.android.settings.title" android:value="@string/app_name" /> <!-- Optional: specify the icon to show with the preference --> <meta-data android:name="com.android.settings.icon" android:resource="@drawable/ic_demo" android:value="true"/> <!-- Optional: Add a summary text when the string is displayed --> <meta-data android:name="com.android.settings.summary" android:resource="@string/demo_summary"/> </activity>
public class DemoFragment extends SettingsFragment { @Override @XmlRes protected int getPreferenceScreenResId() { return R.xml.demo_fragment; } }
public class CarSettingActivities { [...] public static class DemoActivity extends BaseCarSettingsActivity { @Nullable @Override protected Fragment getInitialFragment() { return new DemoFragment(); } } }
<application [...] <activity android:name=".common.CarSettingActivities$DemoActivity" android:exported="true"> <meta-data android:name="distractionOptimized" android:value="true"/> </activity> [...] </application>
Dodawanie preferencji dotyczących intencji zewnętrznych w Ustawieniach samochodu
Jako alternatywę dla wstrzykiwanych preferencji można też wstawić preferencję bezpośrednio w Ustawieniach samochodu, która będzie kierować intencje do innej aplikacji. Można to zrobić, dodając preferencję do ekranu preferencji za pomocą działania intencji, które przekierowuje do aplikacji zewnętrznej. Podobnie jak inne preferencje w Ustawieniach samochodu, te preferencje mają te same atrybuty XML.
<Preference android:key="@string/pk_demo_preference" android:title="@string/demo_preference_title" android:summary="@string/demo_preference_summary" settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"> <intent android:action="android.intent.action.DEMO_ACTION"/> </Preference>
Dodawanie wstrzykniętej preferencji
Wstrzyknięte preferencje zawierają intencje prowadzące do działań zewnętrznych lub wewnętrznych. Na przykład element ustawień Google na stronie głównej Ustawień to wstrzyknięte ustawienie. Wstrzyknięte preferencje są szczególnie przydatne, gdy spełniony jest dowolny z tych warunków. Ustawienie:
Aby skonfigurować aktywność jako wstrzyknięte ustawienie:
Aby wstrzyknięte ustawienie pojawiało się na określonej stronie w aplikacji CarSettings, dodaj do pliku XML ten przykładowy kod, odpowiednio modyfikując zmienne:
<com.android.car.settings.common.LogicalPreferenceGroup <!-- Replace key string --> android:key="@string/pk_system_extra_settings" <!-- Indicates the preferences in the group should be injected in. ExtraSettingsPreferenceController contains the logic to pull in injected preferences. --> settings:controller="com.android.settings.common.ExtraSettingsPreferenceController"> <!-- Tells the controller what activities should be pulled into this preference group. --> <intent android:action="com.android.settings.action.EXTRA_SETTINGS"> <!-- Name and value should match the metadata in your activity --> <extra android:name="com.android.settings.category" android:value="com.android.settings.category.demo_category"/> </intent> </com.android.car.settings.common.LogicalPreferenceGroup>