Dodawanie ustawień samochodu

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:

  1. Zdefiniuj plik XML:
    1. Upewnij się, że wszystkie preferencje mają zdefiniowane android:key. Lista kluczy jest przechowywana w preference_keys.xml. Klucze preferencji powinny być niepowtarzalne.
    2. Na potrzeby indeksowania w wyszukiwarce ekrany ustawień powinny mieć zdefiniowany android:key. Lista klawiszy ekranu ustawień jest aktualizowana w preference_screen_keys.xml. Klucze ekranu ustawień powinny być też unikalne.
    3. Jeśli ustawienie wyświetla tylko informacje statyczne (np. bez specjalnej logiki biznesowej), ustaw kontroler ustawień na wartość com.android.car.settings.common.DefaultRestrictionsPreferenceController.
    4. Jeśli preferencja wymaga logiki biznesowej, ustaw kontroler preferencji za pomocą nowej nazwy kontrolera preferencji.
  2. (w razie potrzeby) Utwórz kontroler preferencji w odpowiednim pakiecie, który rozszerza klasę PreferenceController. W razie potrzeby zapoznaj się z dokumentacją Javadoc.
  3. Utwórz fragment z getPreferenceScreenResId zwracający plik XML zdefiniowany w kroku 1.
  4. Utwórz w CarSettingActivities aktywność rozszerzającą BaseCarSettingsActivity, a potem zaimplementuj getInitialFragment(), zwracając fragment zdefiniowany w kroku 3.
  5. Zaktualizuj AndroidManifest.xml, aby uwzględnić aktywność zdefiniowaną w kroku 4.

Przykład

Ten materiał obrazuje ten proces.

  1. 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>
  2. 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>
  3. 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;
        }
    }
  4. Aby utworzyć fragment, zastąpij getPreferenceScreenResId:
  5. public class DemoFragment extends SettingsFragment {
    
        @Override
        @XmlRes
        protected int getPreferenceScreenResId() {
            return R.xml.demo_fragment;
        }
    }
  6. Aby utworzyć nowy fragment, utwórz aktywność w sekcji CarSettingActivities:
  7. public class CarSettingActivities {
        [...]
        public static class DemoActivity extends BaseCarSettingsActivity {
            @Nullable
            @Override
            protected Fragment getInitialFragment() {
                return new DemoFragment();
            }
        }
    }
  8. Zaktualizuj plik manifestu, dodając nową aktywność:
  9. <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:

    • 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 skonfigurować aktywność jako wstrzyknięte ustawienie:

    1. Aby oznaczyć działanie jako wstrzyknięte ustawienie, dodaj do niego filtr intencji.
    2. 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 ramach CategoryKey, ale nie ma żadnych ograniczeń dotyczących definiowania własnych kategorii przez producentów OEM.
    3. (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>

    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>