Добавить настройки автомобиля

Большинство страниц в Car Settings реализованы как серия фрагментов, расширяющих SettingsFragment , причем каждая из них имеет свою собственную активность, определенную в CarSettingActivities . Эти статические действия являются продолжением BaseCarSettingsActivity . В дополнение к этим настройкам вы можете добавить настройки из других системных приложений, которые будут отображаться в CarSettings.

Добавьте новую настройку в настройках автомобиля.

Чтобы добавить новую настройку:

  1. Определите XML-файл:
    1. Убедитесь, что во всех настройках определен android:key . Список ключей хранится в preference_keys.xml . Ключи предпочтений должны быть уникальными.
    2. Для целей индексации поиска экраны предпочтений также должны иметь определенный android:key . Список экранных клавиш предпочтений хранится в preference_screen_keys.xml . Клавиши экрана предпочтений также должны быть уникальными.
    3. Если предпочтение отображает только статическую информацию (например, без специальной бизнес-логики), установите контроллер предпочтений как com.android.car.settings.common.DefaultRestrictionsPreferenceController .
    4. Если предпочтение требует бизнес-логики, задайте для контроллера предпочтений новое имя контроллера предпочтений.
  2. ( При необходимости ) Создайте контроллер предпочтений в соответствующем пакете, который расширяет PreferenceController . При необходимости см. Javadoc.
  3. Создайте фрагмент с помощью getPreferenceScreenResId возвращающий XML-файл, определенный на шаге 1.
  4. Создайте в CarSettingActivities действие, расширяющее BaseCarSettingsActivity , а затем реализуйте getInitialFragment() , возвращая фрагмент, определенный на шаге 3.
  5. Обновите AndroidManifest.xml , включив в него действие, определенное на шаге 4.

Пример

Следующий материал иллюстрирует этот процесс.

  1. Определите XML-файл с именем 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. Добавьте ключи предпочтений в 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. Добавьте экранную клавишу предпочтений в preference_screen_keys.xml :
    <resources>
        [...]
        <string name="psk_demo" translatable="false">demo_screen</string>
    </resources>

    Для первого примера предпочтения используйте DefaultRestrictionsPreferenceController . Для второго предпочтения используйте собственный контроллер предпочтений, который необходимо определить. В этом примере вы можете настроить эту настройку только для доступных пользователей с правами администратора. Для этого определите следующий пользовательский контроллер:

    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. Чтобы создать фрагмент, переопределите getPreferenceScreenResId :
  5. public class DemoFragment extends SettingsFragment {
    
        @Override
        @XmlRes
        protected int getPreferenceScreenResId() {
            return R.xml.demo_fragment;
        }
    }
  6. Чтобы сохранить новый фрагмент, создайте активность в CarSettingActivities :
  7. public class CarSettingActivities {
        [...]
        public static class DemoActivity extends BaseCarSettingsActivity {
            @Nullable
            @Override
            protected Fragment getInitialFragment() {
                return new DemoFragment();
            }
        }
    }
  8. Обновите файл манифеста новым действием:
  9. <application
        [...]
        <activity
            android:name=".common.CarSettingActivities$DemoActivity"
            android:exported="true">
            <meta-data android:name="distractionOptimized" android:value="true"/>
        </activity>
        [...]
    </application>

    Добавьте настройку внешнего намерения в настройках автомобиля.

    В качестве альтернативы введенным настройкам также можно вставить настройку непосредственно в «Настройки автомобиля», которая будет использоваться в другом приложении. Это можно сделать, просто добавив предпочтение на экран предпочтений с действием намерения, которое разрешается во внешнее приложение. Как и другие настройки в настройках автомобиля, эти настройки имеют те же атрибуты 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>

    Добавить внедренное предпочтение

    Внедренные предпочтения содержат намерения, ведущие к внешним или внутренним действиям. Например, элемент настройки Google на главной странице настроек является внедренным предпочтением. Внедренные предпочтения особенно полезны, когда выполняется любое из следующих условий. Обстановка:

    • Не реализовано напрямую в приложении CarSettings (например, внедрение настройки, реализованной OEM-производителями).
    • Должно появиться в приложении CarSettings.

    Чтобы настроить действие как внедренный параметр:

    1. Чтобы пометить действие как внедренный параметр, добавьте к действию фильтр намерений.
    2. Сообщите приложению CarSettings, к какой категории оно принадлежит. Категория является константой, определенной в CategoryKey , и используется для указания, на каком уровне CarSettings должна появиться введенная настройка. Мы предоставляем набор категорий внутри CategoryKey , но OEM-производители не имеют ограничений на определение своих собственных категорий.
    3. ( необязательно ) Добавьте текст сводки при отображении настройки:
      <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>

    Чтобы введенный параметр отображался на определенной странице в приложении CarSettings, включите следующий пример кода в XML, изменяя переменные там, где это необходимо:

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