Dodaj ustawienia samochodu

Większość stron w Car Settings jest zaimplementowana jako seria fragmentów rozszerzających SettingsFragment , przy czym każda z nich ma własną aktywność zdefiniowaną w CarSettingActivities . Te statyczne działania są rozszerzone z BaseCarSettingsActivity . Oprócz tych ustawień możesz wprowadzić preferencje z innych aplikacji systemowych, aby wyświetlić je w ustawieniach samochodu.

Dodaj nowe preferencje w Ustawieniach samochodu

Aby dodać nowe ustawienie:

  1. Zdefiniuj plik XML:
    1. Upewnij się, że wszystkie preferencje zdefiniowały android:key . Lista kluczy jest przechowywana w pliku preference_keys.xml . Klucze preferencji powinny być unikalne.
    2. Na potrzeby indeksowania wyszukiwania ekrany preferencji powinny również mieć zdefiniowany android:key . Lista klawiszy ekranu preferencji jest przechowywana w preference_screen_keys.xml . Klawisze ekranu preferencji również powinny być unikalne.
    3. Jeśli preferencja wyświetla tylko informacje statyczne (na przykład brak specjalnej logiki biznesowej), ustaw kontroler preferencji jako com.android.car.settings.common.DefaultRestrictionsPreferenceController .
    4. Jeśli preferencja wymaga logiki biznesowej, ustaw kontroler preferencji na nową nazwę kontrolera preferencji.
  2. ( Jeśli jest to wymagane ) Utwórz kontroler preferencji w odpowiednim pakiecie, który rozszerza PreferenceController . W razie potrzeby zobacz dokument Javadoc.
  3. Utwórz fragment, w którym getPreferenceScreenResId zwróci plik XML zdefiniowany w kroku 1.
  4. Utwórz działanie w CarSettingActivities , które rozszerza BaseCarSettingsActivity , a następnie zaimplementuj getInitialFragment() , zwracając fragment zdefiniowany w kroku 3.
  5. Zaktualizuj plik AndroidManifest.xml , aby uwzględnić działanie zdefiniowane w kroku 4.

Przykład

Poniższy 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 klucz ekranu preferencji do preference_screen_keys.xml :
    <resources>
        [...]
        <string name="psk_demo" translatable="false">demo_screen</string>
    </resources>
    

    W przypadku pierwszej przykładowej preferencji użyj DefaultRestrictionsPreferenceController . W przypadku drugiej preferencji użyj niestandardowego kontrolera preferencji, który należy zdefiniować. W tym przykładzie możesz dostosować tę preferencję tylko do dostępnych administratorów. Aby to zrobić, zdefiniuj następujący 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 zachować nowy fragment, utwórz działanie w CarSettingActivities :
  7. public class CarSettingActivities {
        [...]
        public static class DemoActivity extends BaseCarSettingsActivity {
            @Nullable
            @Override
            protected Fragment getInitialFragment() {
                return new DemoFragment();
            }
        }
    }
    
  8. Zaktualizuj plik manifestu o nowe działanie:
  9. <application
        [...]
        <activity
            android:name=".common.CarSettingActivities$DemoActivity"
            android:exported="true">
            <meta-data android:name="distractionOptimized" android:value="true"/>
        </activity>
        [...]
    </application>
    

    Dodaj preferencję zamiaru zewnętrznego w Ustawieniach samochodu

    Alternatywą dla wprowadzonych preferencji jest także możliwość wstawienia preferencji bezpośrednio w Ustawieniach samochodu, która będzie przeznaczona dla innej aplikacji. Można to zrobić, po prostu dodając preferencję do ekranu preferencji z akcją intencji, która prowadzi do aplikacji zewnętrznej. Podobnie jak inne preferencje w Ustawieniach samochodu, te preferencje mają te same dostępne 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 wstrzykniętą preferencję

    Wstrzyknięte preferencje zawierają zamiary prowadzące do działań zewnętrznych lub wewnętrznych. Na przykład element ustawień Google na stronie głównej Ustawień to wstrzyknięta preferencja. Wstrzyknięte preferencje są szczególnie przydatne, gdy spełniony jest którykolwiek z poniższych warunków. Ustawienie:

    • Nie jest bezpośrednio zaimplementowane w aplikacji CarSettings (np. poprzez wstrzykiwanie ustawienia zaimplementowanego przez producentów OEM).
    • Powinien pojawić się w aplikacji CarSettings.

    Aby skonfigurować działanie jako wstrzyknięte ustawienie:

    1. Aby oznaczyć działanie jako wstrzyknięte ustawienie, dodaj do działania filtr intencji.
    2. Powiedz aplikacji CarSettings, do której kategorii należy. Kategoria jest stałą zdefiniowaną w CategoryKey i służy do wskazania, na którym poziomie CarSettings powinno pojawić się wstrzyknięte ustawienie. Wewnątrz CategoryKey udostępniamy zestaw kategorii, ale producenci OEM nie mają żadnych ograniczeń w zakresie definiowania własnych kategorii.
    3. ( opcjonalnie ) Dodaj tekst podsumowania, gdy ustawienie jest wyświetlane:
      <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 wprowadzone ustawienie pojawiło się na określonej stronie aplikacji CarSettings, dołącz następujący przykładowy kod do pliku XML, modyfikując zmienne tam, gdzie to konieczne:

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