Dans la plupart des cas, réorganiser la hiérarchie des paramètres est relativement simple et consiste généralement à déplacer la préférence et la PreferenceController
appropriées vers un autre fichier XML. Si PreferenceController
utilise use(...)
, veillez à le supprimer de l'SettingsFragment
précédent et à l'ajouter au nouveau SettingsFragment
.
Cette page fournit des exemples de réorganisation des paramètres pour examiner les situations pouvant se produire.
Déplacer une préférence de base
Cet exemple explique comment déplacer une préférence d'un écran de préférences à un autre, dans lequel la préférence ne dispose que d'un contrôleur de préférences par défaut. Dans cet exemple, vous déplacez la préférence "Unités" de l'écran des préférences de la page d'accueil vers l'écran des préférences système. Pour ce faire, déplacez le code XML suivant de homepage_fragment.xml
à l'emplacement approprié dans system_settings_fragment.xml
:
<Preference android:icon="@drawable/ic_settings_units" android:key="@string/pk_units_settings_entry" android:title="@string/units_settings" settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"> <intent android:targetPackage="com.android.car.settings" android:targetClass="com.android.car.settings.common.CarSettingActivities$UnitsSettingsActivity"/> </Preference>
Déplacer une préférence qui utilise use(...)
Prenons l'exemple plus complexe suivant, qui déplace toutes les préférences du fragment "Avertissement et limite de données" d'un niveau dans le fragment "Consommation de données", qui met à jour DataWarningAndLimitFragment.java
pour inclure la méthode use
afin de transmettre des informations aux contrôleurs de préférences après la création.
- Déplacez le fichier XML concerné à l'emplacement souhaité dans
data_usage_fragment.xml
:<Preference android:key="@string/pk_data_usage_cycle" android:title="@string/app_usage_cycle" settings:controller="com.android.car.settings.datausage.CycleResetDayOfMonthPickerPreferenceController"/> <com.android.car.settings.common.LogicalPreferenceGroup android:key="@string/pk_data_warning_group" settings:controller="com.android.car.settings.datausage.DataWarningPreferenceController"> <SwitchPreference android:key="@string/pk_data_set_warning" android:title="@string/set_data_warning"/> <Preference android:key="@string/pk_data_warning" android:title="@string/data_warning"/> </com.android.car.settings.common.LogicalPreferenceGroup> <com.android.car.settings.common.LogicalPreferenceGroup android:key="@string/pk_data_limit_group" settings:controller="com.android.car.settings.datausage.DataLimitPreferenceController"> <SwitchPreference android:key="@string/pk_data_set_limit" android:title="@string/set_data_limit"/> <Preference android:key="@string/pk_data_limit" android:title="@string/data_limit"/> </com.android.car.settings.common.LogicalPreferenceGroup>
- Dans
DataWarningAndLimitFragment.java
, déterminez comment la méthodeuse
est utilisée.@Override public void onAttach(Context context) { super.onAttach(context); mPolicyEditor = new NetworkPolicyEditor(NetworkPolicyManager.from(context)); mNetworkTemplate = getArguments().getParcelable( NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE); if (mNetworkTemplate == null) { mTelephonyManager = context.getSystemService(TelephonyManager.class); mSubscriptionManager = context.getSystemService(SubscriptionManager.class); mNetworkTemplate = DataUsageUtils.getMobileNetworkTemplate(mTelephonyManager, DataUsageUtils.getDefaultSubscriptionId(mSubscriptionManager)); } // Loads the current policies to the policy editor cache. mPolicyEditor.read(); List<DataWarningAndLimitBasePreferenceController> preferenceControllers = Arrays.asList( use(CycleResetDayOfMonthPickerPreferenceController.class, R.string.pk_data_usage_cycle), use(DataWarningPreferenceController.class, R.string.pk_data_warning_group), use(DataLimitPreferenceController.class, R.string.pk_data_limit_group)); for (DataWarningAndLimitBasePreferenceController preferenceController : preferenceControllers) { preferenceController.setNetworkPolicyEditor(mPolicyEditor); preferenceController.setNetworkTemplate(mNetworkTemplate); } }
Dans ce cas, la méthode
use
définit l'éditeur de règles réseau et le modèle de réseau pour les contrôleurs de préférences. Étant donné que cet exemple déplace toutes les préférences et que tout le code de la méthodeonAttach
est pertinent pour définir ces paramètres de préférence, il est approprié de copier l'intégralité du contenu de la méthode dans le nouveau fragment. Toutefois, cela varie en fonction de la préférence spécifique. Vous devez également déplacer les variables d'instance pertinentes.Toutefois, il existe une complication. Le fragment d'origine s'attendait à ce que
NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE
soit transmis en tant qu'argument, qui doit provenir de l'intent vers l'activité (lorsqu'il est fourni).Pour obtenir ces informations, créez une méthode
newInstance
et transmettez le modèle lorsqu'il est présent (sinon transmettez la valeur nulle), puis mettez à jour l'activité pourDataUsageFragment
ou obtenez les informations d'intent directement dans la méthodeonAttach
à l'aide degetActivity().getIntent()
. Dans les deux cas, vous pouvez transmettre les informations nécessaires à cette méthode comme vous l'avez fait ci-dessus. - Identifiez toutes les autres dépendances ou actions d'intent attendues dans l'ancien fragment avant de nettoyer les anciens fragments et fichiers XML. Dans ce cas, une valeur de configuration de superposition pointe vers l'ancienne activité, qui doit être mise à jour pour pointer vers l'activité appropriée.
Ajouter un écran de préférences à la hiérarchie
Pour ajouter un écran de préférences à la hiérarchie, consultez Ajouter des paramètres de voiture.
Après avoir créé l'écran de préférences, utilisez les exemples ci-dessus pour réorganiser la hiérarchie des préférences comme vous le souhaitez.