Per la maggior parte, riorganizzare la gerarchia delle impostazioni è relativamente semplice e in genere consiste nel spostare la preferenza e PreferenceController
pertinenti in un altro file XML. Se PreferenceController
utilizza use(...)
, assicurati di rimuoverlo dal SettingsFragment
precedente e di aggiungerlo al nuovo SettingsFragment
.
Questa pagina fornisce esempi per riordinare le impostazioni in modo da esaminare le situazioni che possono verificarsi.
Spostare una preferenza di base
Questo esempio spiega come spostare una preferenza da una schermata delle preferenze all'altra,
in cui la preferenza ha solo un controller delle preferenze predefinito. In questo esempio, muovi la preferenza Unità dalla schermata delle preferenze della home page alla schermata delle preferenze di sistema. A tale scopo, sposta il seguente codice XML da homepage_fragment.xml
nella
posizione 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>
Spostare una preferenza che utilizza use(...)
Prendi in considerazione il seguente esempio più complesso che sposta tutte le preferenze nel frammento Avviso e limite relativi ai dati di un livello più in alto nel frammento Utilizzo dei dati, che aggiorna DataWarningAndLimitFragment.java
in modo da includere il metodo use
per trasmettere 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 come viene utilizzato il metodouse
.@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 delle preferenze. Poiché questo esempio sposta tutte le preferenze e tutto il codice nel metodoonAttach
è pertinente all'impostazione di questi parametri di preferenza, sarebbe opportuno copiare l'intero contenuto del metodo nel nuovo frammento. Tuttavia, la situazione varia a seconda della preferenza specifica. Devi anche spostare le variabili di istanza pertinenti.Tuttavia, c'è un problema. Il frammento originale prevedeva che
NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE
fosse passato come argomento, che deve provenire dall'intent all'attività (se fornito).Per ottenere queste informazioni necessarie, crea un metodo
newInstance
e passa il modello se presente (in caso contrario, passa null) e poi aggiorna l'attività perDataUsageFragment
o ottieni le informazioni sull'intent direttamente nel metodoonAttach
utilizzandogetActivity().getIntent()
. In entrambi i casi, puoi passare le informazioni necessarie per questo metodo come indicato sopra. - Identifica eventuali altre dipendenze o azioni di intent previste nel vecchio frammento prima di eliminare i vecchi frammenti e i file XML. In questo caso, un valore di configurazione della sovrapposizione fa riferimento alla vecchia attività, che deve essere aggiornata in modo da puntare all'attività corretta.
Aggiungere una schermata delle preferenze alla gerarchia
Per aggiungere una nuova schermata delle preferenze alla gerarchia, vedi Aggiungere le impostazioni dell'auto.
Dopo aver creato la nuova schermata delle preferenze, utilizza gli esempi precedenti per riorganizzare la gerarchia delle preferenze come preferisci.