En su mayor parte, reorganizar la jerarquía de Configuración es relativamente sencillo y generalmente consiste en mover la preferencia relevante y PreferenceController
a un archivo XML diferente. Si PreferenceController
usa use(...)
, asegúrese de eliminarlo del SettingsFragment
anterior y agregarlo al nuevo SettingsFragment
.
Este artículo proporciona ejemplos para reordenar la configuración para revisar situaciones que pueden ocurrir.
Mover una preferencia básica
Este ejemplo explica cómo mover una preferencia de una pantalla de preferencias a otra, en la que la preferencia solo tiene un controlador de preferencia predeterminado. En este ejemplo, mueve la preferencia Unidades de la pantalla de preferencias de la página de inicio a la pantalla de preferencias del sistema. Para hacerlo, mueva el siguiente XML de homepage_fragment.xml
a la ubicación adecuada en 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>
Mover una preferencia que usa use(...)
Considere el siguiente ejemplo más complejo que mueve todas las preferencias en el fragmento Advertencia y límite de datos un nivel hacia arriba en el fragmento Uso de datos, que actualiza DataWarningAndLimitFragment.java
para incluir el método de use
para pasar información a los controladores de preferencia después de la construcción.
- Mueva el XML relevante a la ubicación deseada en
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>
- En
DataWarningAndLimitFragment.java
, determine cómo seuse
el método de uso.@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); } }
En este caso, el método de
use
establece el editor de políticas de red y la plantilla de red para los controladores de preferencias. Debido a que este ejemplo mueve todas las preferencias y todo el código en el métodoonAttach
es relevante para configurar estos parámetros de preferencia, sería apropiado copiar todo el contenido del método en el nuevo fragmento. Sin embargo, esto varía dependiendo de la preferencia específica. También debe moverse sobre las variables de instancia relevantes.Sin embargo, hay una complicación. El fragmento original esperaba que
NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE
se pasara como un argumento, que debería provenir de la intención de la actividad (cuando se proporciona).Para obtener esta información necesaria, cree un método
newInstance
y pase la plantilla cuando esté presente (de lo contrario, pase nulo) y luego actualice la actividad paraDataUsageFragment
u obtenga la información de la intención directamente en el métodoonAttach
usandogetActivity().getIntent()
. En cualquier caso, puede pasar la información necesaria para este método como lo hizo anteriormente. - Identifique cualquier otra dependencia o acción de intención esperada en el fragmento anterior antes de limpiar los fragmentos antiguos y los archivos XML. En este caso, un valor de configuración de superposición apunta a la actividad anterior, que debe actualizarse para que apunte a la actividad correcta.
Adición de una pantalla de preferencias a la jerarquía
Para agregar una nueva pantalla de preferencias a la jerarquía, consulte Agregar configuración de automóvil .
Después de crear la nueva pantalla de preferencias, utilice los ejemplos anteriores para reorganizar la jerarquía de preferencias como desee.