Dodaj ustawienia samochodu

Większość stron w Ustawieniach samochodu jest zaimplementowana jako seria fragmenty, które rozciągają się SettingsFragment, a każda z nich ma własną aktywność zdefiniowaną w narzędziu CarSettingActivities. Okres tych aktywności statycznych został przedłużony od BaseCarSettingsActivity. Oprócz tych ustawień możesz też wstrzykiwać preferencje z innych aplikacji systemowych, aby pojawią się w Ustawieniach samochodu.

Dodaj nowe ustawienie w Ustawieniach samochodu

Aby dodać nowe ustawienie:

  1. Zdefiniuj plik XML:
    1. Upewnij się, że we wszystkich preferencjach jest zdefiniowany android:key. Lista kluczy jest utrzymanych w regionie preference_keys.xml. Ustawienia muszą być unikalne.
    2. Na potrzeby indeksowania wyników wyszukiwania ekrany preferencji powinny też mieć zdefiniowaną wartość android:key. Lista klawiszy na ekranie preferencji jest obsługiwane w regionie preference_screen_keys.xml. Preferencje Klawisze ekranu również powinny być unikalne.
    3. Jeśli ustawienie wyświetla tylko informacje statyczne (np. bez specjalnej logiki biznesowej), ustaw kontroler preferencji jako com.android.car.settings.common.DefaultRestrictionsPreferenceController
    4. Jeśli preferencja wymaga logiki biznesowej, ustaw ją z nową nazwą kontrolera preferencji.
  2. (W razie potrzeby) Utwórz kontroler preferencji w odpowiednich pakiet, który obejmuje PreferenceController. W razie potrzeby zajrzyj do pliku Javadoc.
  3. Utwórz fragment, w którym getPreferenceScreenResId zwraca wartość plik XML zdefiniowany w kroku 1.
  4. Utwórz aktywność w: CarSettingActivities która obejmuje BaseCarSettingsActivity a następnie implementuję getInitialFragment(), zwracając fragment zdefiniowane w kroku 3.
  5. Zaktualizuj pole AndroidManifest.xml, aby uwzględnić aktywność zdefiniowaną w kroku 4.

Przykład

Następujący materiał ilustruje 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 klawisz ekranu preferencji do aplikacji preference_screen_keys.xml:
    <resources>
        [...]
        <string name="psk_demo" translatable="false">demo_screen</string>
    </resources>
    

    W pierwszym przykładzie należy użyć właściwości DefaultRestrictionsPreferenceController. W przypadku drugiej preferencji użyj niestandardowego kontrolera preferencji, który musi być zdefiniowany. W tym przykładzie możesz zmienić to ustawienie tak, aby obejmowały tylko dostępnych administratorów. 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ąp getPreferenceScreenResId:
  5. public class DemoFragment extends SettingsFragment {
    
        @Override
        @XmlRes
        protected int getPreferenceScreenResId() {
            return R.xml.demo_fragment;
        }
    }
    
  6. Aby zatrzymać nowy fragment, utwórz aktywność w obszarze CarSettingActivities:
  7. public class CarSettingActivities {
        [...]
        public static class DemoActivity extends BaseCarSettingsActivity {
            @Nullable
            @Override
            protected Fragment getInitialFragment() {
                return new DemoFragment();
            }
        }
    }
    
  8. Dodaj do pliku manifestu nową aktywność:
  9. <application
        [...]
        <activity
            android:name=".common.CarSettingActivities$DemoActivity"
            android:exported="true">
            <meta-data android:name="distractionOptimized" android:value="true"/>
        </activity>
        [...]
    </application>
    

    Dodaj preferencję zewnętrzną w ustawieniach samochodu

    Zamiast preferencji wstrzykiwanych możesz również użyć wstawić preferencję bezpośrednio w ustawieniach samochodu, innej aplikacji. Można to zrobić, dodając preferencje na ekran preferencji z działaniem intencji, które prowadzi do . Tak samo jak w przypadku innych ustawień samochodu, 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>
    

    Dodaj preferencję

    Wstrzyknięte preferencje zawierają intencje prowadzące do zewnętrznych lub wewnętrznych aktywności. Przykładem może być element ustawienia Google w sekcji Ustawienia. strona główna jest preferencją wstrzykiwaną. Wstrzyknięte preferencje są szczególnie ważne przydatne, kiedy spełniony jest dowolny z tych warunków. Ustawienie:

    • nie jest zaimplementowany bezpośrednio w aplikacji CarSettings (np. wstrzykiwanie ustawienia stosowanego przez producentów OEM).
    • Opcja powinna pojawić się w aplikacji CarSettings.

    Aby skonfigurować działanie jako ustawienie wstrzykiwane:

    1. Aby oznaczyć aktywność jako wstrzyknięte ustawienie, dodaj filtr intencji do aktywność.
    2. Poinformuj aplikację CarSettings, do której kategorii należy. Kategoria to stała, zdefiniowana w zasadzie CategoryKey, i służy do wskazania, na jakim poziomie CarSettings wprowadzono ustawienie. powinny pojawić się w etykiecie. Udostępniamy zestaw kategorii w ramach CategoryKey, ale producenci OEM nie muszą określać żadnych ograniczeń. do tworzenia własnych kategorii.
    3. (Opcjonalnie) Dodaj tekst podsumowania po wyświetleniu 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 CarSettings, umieść w kodzie XML poniższy przykładowy kod, modyfikując zmiennych (w stosownych przypadkach):

    <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>