Nella maggior parte dei casi, riorganizzare la gerarchia delle Impostazioni è relativamente semplice e in genere consiste nello spostare la preferenza pertinente e PreferenceController
in un file XML diverso. Se PreferenceController
utilizza use(...)
, assicurati di rimuoverlo dal precedente SettingsFragment
e di aggiungerlo al nuovo SettingsFragment
.
Questa pagina fornisce esempi per riordinare le Impostazioni per esaminare le situazioni che potrebbero verificarsi.
Sposta 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 preferenza predefinito. In questo esempio, sposti la preferenza Unità dalla schermata delle preferenze Home page alla schermata delle preferenze Sistema. Per fare ciò, sposta il seguente 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>
Sposta una preferenza che utilizza use(...)
Considera il seguente esempio più complesso che sposta tutte le preferenze nel frammento Data Warning & Limit su di un livello nel frammento Data Usage, che aggiorna DataWarningAndLimitFragment.java
per includere il metodo use
per passare le informazioni ai controller delle preferenze dopo la costruzione.
- Sposta il codice XML pertinente nella posizione desiderata 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
, determinare 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
è rilevante per impostare questi parametri di preferenza, sarebbe appropriato copiare l'intero contenuto del metodo nel nuovo frammento. Tuttavia, questo varia a seconda della preferenza specifica. È necessario spostarsi anche sulle variabili di istanza pertinenti.Tuttavia, c’è una complicazione. Il frammento originale prevedeva che
NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE
venisse passato come argomento, che dovrebbe provenire dall'intento all'attività (se fornito).Per ottenere queste informazioni necessarie, crea un metodo
newInstance
e passa il modello quando presente (altrimenti passa in null) e quindi aggiorna l'attività perDataUsageFragment
o ottieni le informazioni sull'intento direttamente nel metodoonAttach
utilizzandogetActivity().getIntent()
. In entrambi i casi, puoi passare le informazioni necessarie per questo metodo come hai fatto sopra. - Identificare eventuali altre dipendenze o azioni di intenti previste nel vecchio frammento prima di ripulire i vecchi frammenti e i file XML. In questo caso, un valore di configurazione sovrapposto punta alla vecchia attività, che deve essere aggiornata per puntare all'attività corretta.
Aggiungi una schermata delle preferenze alla gerarchia
Per aggiungere una nuova schermata delle preferenze alla gerarchia, vedere Aggiungi impostazioni auto .
Dopo aver creato la nuova schermata delle preferenze, utilizzare gli esempi precedenti per riorganizzare la gerarchia delle preferenze come desiderato.