Per la maggior parte, il riordinamento della gerarchia delle impostazioni è relativamente
in modo diretto e di solito consiste nello
spostare la preferenza pertinente
PreferenceController
in un altro file XML. Se
PreferenceController
utilizza use(...)
, assicurati di rimuovere
della versione precedente di SettingsFragment
e aggiungerla al nuovo
SettingsFragment
.
Questa pagina fornisce esempi di riordinamento delle Impostazioni al fine di esaminare situazioni in cui che possono verificarsi.
Spostare una preferenza di base
Questo esempio spiega come spostare una preferenza da una schermata di preferenza a un'altra.
in cui la preferenza ha solo
un controller di preferenze predefinito. In questo esempio,
sposta la preferenza Unità dalla schermata Preferenza home page alla preferenza di sistema
schermo. Per farlo, sposta il seguente XML da homepage_fragment.xml
nella
località appropriata in 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>
Sposta una preferenza che utilizza(...)
Considera il seguente esempio più complesso che sposta tutte le preferenze
nel riquadro Avviso sui dati Limita il frammento a un livello superiore nel frammento Utilizzo dati, che
aggiorna DataWarningAndLimitFragment.java
per includere il metodo use
per passare le informazioni ai controller delle preferenze dopo la costruzione.
- Sposta il file XML pertinente nella posizione che preferisci in
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>
- In
DataWarningAndLimitFragment.java
, determina in che modouse
.@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); } }
In questo caso, il metodo
use
imposta l'editor dei criteri di rete e il modello di rete per i controller di preferenze. Poiché in questo esempio vengono le preferenze e tutto il codice nel metodoonAttach
sia pertinente l'impostazione di questi parametri di preferenza, sarebbe opportuno copiare l'intero nel nuovo frammento. Tuttavia, questo varia a seconda preferenza specifica. Devi anche spostare le variabili di istanza pertinenti.Tuttavia, c'è una complicazione. Il frammento originale previsto
NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE
per essere come argomento, che deve derivare dall'intent all'attività (se fornite).Per ottenere queste informazioni necessarie, crea un
newInstance
e passare nel modello se presente (in caso contrario, passare a null), quindi aggiorna l'attività perDataUsageFragment
o ottieni l'intent direttamente nel metodoonAttach
utilizzandogetActivity().getIntent()
. In entrambi i casi, puoi passare per questo metodo, come hai fatto sopra. - Identifica eventuali altre dipendenze o azioni di intent previste nel vecchio frammento prima ripulire i vecchi frammenti e i file XML. In questo caso, un overlay config rimanda all'attività precedente, che deve essere aggiornata in modo che punti a l'attività corretta.
Aggiungi una schermata di preferenza alla gerarchia
Per aggiungere una nuova schermata di preferenza alla gerarchia, consulta la sezione Aggiunta di impostazioni dell'auto.
Dopo aver creato la nuova schermata delle preferenze, utilizza gli esempi precedenti per riorganizzare le impostazioni la gerarchia delle preferenze.