Большинство страниц в Car Settings реализованы в виде серии фрагментов, которые расширяют SettingsFragment , причем каждый из них имеет свою собственную активность, определенную в CarSettingActivities . Эти статические действия расширены из BaseCarSettingsActivity . В дополнение к этим настройкам вы можете ввести настройки из других системных приложений, чтобы они отображались в CarSettings.
Добавление нового предпочтения в настройках автомобиля
Чтобы добавить новую настройку:
- Определите файл XML:
- Убедитесь, что все настройки определили
android:key. Список ключей хранится вpreference_keys.xml. Ключи настроек должны быть уникальными. - В целях индексации поиска экраны настроек также должны иметь определенный
android:key. Список экранных клавиш предпочтений хранится вpreference_screen_keys.xml. Клавиши экрана предпочтений также должны быть уникальными. - Если параметр отображает только статическую информацию (например, без специальной бизнес-логики), установите контроллер предпочтения как
com.android.car.settings.common.DefaultRestrictionsPreferenceController. - Если предпочтение требует бизнес-логики, задайте для контроллера предпочтений новое имя контроллера предпочтений.
- Убедитесь, что все настройки определили
- ( При необходимости ) Создайте контроллер предпочтений в соответствующем пакете, который расширяет
PreferenceController. При необходимости см. Javadoc. - Создайте фрагмент с
getPreferenceScreenResIdвозвращающим XML-файл, определенный на шаге 1. - Создайте действие в
CarSettingActivities, которое расширяетBaseCarSettingsActivity, а затем реализуйтеgetInitialFragment(), возвращая фрагмент, определенный на шаге 3. - Обновите
AndroidManifest.xml, включив в него действие, определенное на шаге 4.
Пример
Следующий материал иллюстрирует этот процесс.
- Определите файл 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> - Добавьте ключи предпочтений в
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> - Добавьте ключ экрана предпочтений в файл
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; } } - Чтобы создать фрагмент, переопределите
getPreferenceScreenResId: - Чтобы сохранить новый фрагмент, создайте активность в
CarSettingActivities: - Обновите файл манифеста новой активностью:
- Не реализовано напрямую в приложении CarSettings (например, внедрение настроек, реализованных OEM-производителями).
- Должно появиться в приложении CarSettings.
- Чтобы пометить действие как введенный параметр, добавьте к действию фильтр намерений.
- Сообщите приложению CarSettings, к какой категории оно относится. Категория — это константа, определенная в
CategoryKeyи используемая для указания того, на каком уровне CarSettings должен появиться введенный параметр. Мы предоставляем набор категорий внутриCategoryKey, но для OEM-производителей нет ограничений на определение своих собственных категорий. - ( необязательно ) Добавить текст сводки при отображении параметра:
<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>
Добавление предпочтения внешнего намерения в настройках автомобиля
В качестве альтернативы введенным настройкам также можно вставить настройку непосредственно в настройки автомобиля, которая предназначена для другого приложения. Это можно сделать, просто добавив предпочтение на экран предпочтений с действием намерения, которое разрешается во внешнем приложении. Как и другие предпочтения в настройках автомобиля, эти предпочтения имеют те же атрибуты 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, включите следующий пример кода в 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>