La plupart des pages des paramètres du véhicule sont implémentées sous la forme d'une série
les 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
apparaissent dans Paramètres Voiture.
Ajouter une préférence dans les paramètres du véhicule
Pour ajouter un paramètre:
- Définissez un fichier XML:
<ph type="x-smartling-placeholder">
- </ph>
- Assurez-vous que
android:key
est défini dans toutes les préférences. La liste des clés est conservée danspreference_keys.xml
. Préférences doivent être uniques. - Pour l'indexation de la recherche, les écrans de préférences doivent également avoir
un
android:key
défini. Liste des touches de l'écran des préférences est géré danspreference_screen_keys.xml
. Préférence les touches d'écran doivent également être uniques. - Si la préférence n'affiche que des informations statiques (par exemple,
aucune logique métier particulière), 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 la préférence avec un nouveau nom.
- Assurez-vous que
- (Si nécessaire) Créez le contrôleur de préférences dans les
, qui étend
PreferenceController
. Consultez la documentation Javadoc si nécessaire. - Créez un fragment avec
getPreferenceScreenResId
renvoyant le XML défini à l'étape 1. - Créer une activité dans
CarSettingActivities
qui s'étendBaseCarSettingsActivity
Ensuite, implémentezgetInitialFragment()
en renvoyant le fragment. définis à 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 des 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. Pour cet exemple, vous pouvez personnaliser cette préférence pour les administrateurs 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 directement implémentés dans l'application CarSettings (par exemple, injectant un paramètre implémenté par les OEM).
- Doit s'afficher dans l'application CarSettings.
- Pour marquer l'activité comme un paramètre injecté, ajoutez un filtre d'intent à l'activité.
- Indiquez à l'application CarSettings à quelle catégorie elle appartient. La catégorie est un
constante, définie dans
CategoryKey
, et est utilisé pour indiquer à quel niveau des CarSettings le paramètre injecté doivent apparaître. Nous proposons un ensemble de catégoriesCategoryKey
, mais il n'existe aucune restriction à définir par les OEM leurs propres catégories. - (Facultatif) Ajoutez un texte récapitulatif lorsque le paramètre est affiché:
<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
À la place des préférences injectées, il est également possible insérez une préférence directement dans les paramètres de la voiture qui redirige les intents vers une autre application. Il suffit pour cela d'ajouter une préférence à un écran de préférences avec une action d'intent qui renvoie vers un l'application. Comme les autres préférences dans les 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 requêtes externes ou internes activités. Par exemple, l'élément de paramètre Google dans l'application Paramètres la page d'accueil est une préférence injectée. Les préférences injectées sont particulièrement utile dans les cas suivants : Le paramètre:
Pour configurer une activité en tant que paramètre injecté:
Pour que le paramètre injecté apparaisse sur une page spécifique du CarSettings, incluez l'exemple de code suivant dans le fichier XML, en modifiant 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>