La plupart des pages des paramètres de la voiture sont implémentées sous la forme d'une série de fragments qui étendent SettingsFragment
, chacun d'eux ayant sa propre activité définie dans CarSettingActivities
.
Ces activités statiques sont étendues à partir de BaseCarSettingsActivity
.
En plus de ces paramètres, vous pouvez injecter des préférences d'autres applications système pour qu'elles apparaissent dans CarSettings.
Ajouter une préférence dans les paramètres de la voiture
Pour ajouter un paramètre:
- Définissez un fichier XML :
- Assurez-vous que toutes les préférences ont défini
android:key
. La liste des clés est gérée danspreference_keys.xml
. Les clés de préférences doivent être uniques. - À des fins d'indexation de la recherche, les écrans de préférences doivent également comporter un
android:key
défini. La liste des clés de l'écran de préférences est gérée danspreference_screen_keys.xml
. Les clés de l'écran des préférences doivent également être uniques. - Si la préférence n'affiche que des informations statiques (par exemple, aucune logique métier spéciale), définissez le contrôleur de préférences sur
com.android.car.settings.common.DefaultRestrictionsPreferenceController
. - Si la préférence nécessite une logique métier, définissez le contrôleur de préférences avec un nouveau nom de contrôleur de préférences.
- Assurez-vous que toutes les préférences ont défini
- (Si nécessaire) Créez le contrôleur de préférences dans le package approprié, qui étend
PreferenceController
. Consultez la documentation Javadoc si nécessaire. - Créez un fragment avec
getPreferenceScreenResId
renvoyant le fichier XML défini à l'étape 1. - Créez une activité dans
CarSettingActivities
qui étendBaseCarSettingsActivity
, puis implémentezgetInitialFragment()
, en renvoyant le fragment défini à l'étape 3. - Mettez à jour
AndroidManifest.xml
pour inclure l'activité définie à l'étape 4.
Exemple
Le document suivant illustre ce processus.
- Définissez un fichier XML nommé
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>
- Ajoutez les clés de préférence à
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>
- Ajoutez la clé de l'écran de préférences à
preference_screen_keys.xml
:<resources> [...] <string name="psk_demo" translatable="false">demo_screen</string> </resources>
Pour le premier exemple de préférence, utilisez
DefaultRestrictionsPreferenceController
. Pour la deuxième préférence, utilisez un contrôleur de préférences personnalisé, qui doit être défini. Dans cet exemple, vous pouvez personnaliser cette préférence pour les utilisateurs administrateur disponibles uniquement. Pour ce faire, définissez le contrôleur personnalisé suivant: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; } }
- Pour créer un fragment, remplacez
getPreferenceScreenResId
: - Pour contenir le nouveau fragment, créez une activité dans
CarSettingActivities
: - Mettez à jour le fichier manifeste avec la nouvelle activité:
- Ne sont pas implémentés directement dans l'application CarSettings (par exemple, en injectant un paramètre implémenté par les OEM).
- Il devrait apparaître dans l'application CarSettings.
- Pour marquer l'activité comme paramètre injecté, ajoutez un filtre d'intent à l'activité.
- Indiquez à l'application CarSettings à quelle catégorie elle appartient. La catégorie est une constante, définie dans
CategoryKey
, et permet d'indiquer à quel niveau de CarSettings le paramètre injecté doit apparaître. Nous fournissons un ensemble de catégories dansCategoryKey
, mais les OEM peuvent définir leurs propres catégories sans aucune restriction. - (Facultatif) Ajoutez un texte récapitulatif lorsque le paramètre s'affiche:
<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>
Ajouter une préférence d'intent externe dans les paramètres de la voiture
Au lieu d'utiliser des préférences injectées, vous pouvez également insérer une préférence directement dans les paramètres de la voiture qui transfère des intents vers une autre application. Pour ce faire, il vous suffit d'ajouter une préférence à un écran de préférences avec une action d'intent qui se résout en une application externe. Comme les autres préférences des paramètres de la voiture, ces préférences disposent des mêmes attributs 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>
Ajouter une préférence injectée
Les préférences injectées contiennent des intents menant à des activités externes ou internes. Par exemple, l'élément de paramètre Google sur la page d'accueil des paramètres est une préférence injectée. Les préférences injectées sont particulièrement utiles dans les cas suivants : Paramètre:
Pour configurer une activité en tant que paramètre injecté:
Pour que le paramètre injecté s'affiche sur une page spécifique de l'application CarSettings, incluez l'exemple de code suivant dans le fichier XML, en modifiant les variables le cas échéant:
<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>