Die Neuordnung der Einstellungshierarchie ist größtenteils relativ einfach und besteht normalerweise darin, die relevanten Einstellungen und PreferenceController
in eine andere XML-Datei zu verschieben. Wenn der PreferenceController
use(...)
verwendet, müssen Sie ihn unbedingt aus dem vorherigen SettingsFragment
entfernen und zum neuen SettingsFragment
hinzufügen.
Auf dieser Seite finden Sie Beispiele für die Neuordnung von Einstellungen, um eventuell auftretende Situationen zu überprüfen.
Verschieben Sie eine Grundeinstellung
In diesem Beispiel wird erläutert, wie eine Einstellung von einem Einstellungsbildschirm auf einen anderen verschoben wird, in dem die Einstellung nur über einen Standardeinstellungscontroller verfügt. In diesem Beispiel verschieben Sie die Einheiten-Einstellung vom Homepage-Einstellungsbildschirm in den System-Einstellungsbildschirm. Verschieben Sie dazu den folgenden XML-Code aus homepage_fragment.xml
an den entsprechenden Speicherort 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>
Verschieben Sie eine Einstellung, die use(...) verwendet
Betrachten Sie das folgende komplexere Beispiel, das alle Einstellungen im Fragment „Data Warning & Limit“ um eine Ebene nach oben in das Fragment „Data Usage“ verschiebt, das DataWarningAndLimitFragment.java
so aktualisiert, dass es die Methode use
enthält, um nach der Erstellung Informationen an die Einstellungscontroller zu übergeben.
- Verschieben Sie das relevante XML an die gewünschte Stelle 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>
- Bestimmen Sie in
DataWarningAndLimitFragment.java
, wie dieuse
Methode verwendet wird.@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 diesem Fall legt die
use
den Netzwerkrichtlinieneditor und die Netzwerkvorlage für die Präferenzcontroller fest. Da in diesem Beispiel alle Einstellungen verschoben werden und der gesamte Code in deronAttach
Methode für das Festlegen dieser Einstellungsparameter relevant ist, wäre es angebracht, den gesamten Methodeninhalt in das neue Fragment zu kopieren. Dies variiert jedoch je nach konkreter Präferenz. Sie müssen auch die relevanten Instanzvariablen verschieben.Allerdings gibt es eine Komplikation. Das ursprüngliche Fragment erwartete, dass
NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE
als Argument übergeben wird, das von der Absicht zur Aktivität kommen sollte (sofern bereitgestellt).Um diese benötigten Informationen zu erhalten, erstellen Sie entweder eine
newInstance
Methode und übergeben Sie die Vorlage, sofern vorhanden (andernfalls übergeben Sie null) und aktualisieren Sie dann die Aktivität für dasDataUsageFragment
oder rufen Sie die Absichtsinformationen direkt in deronAttach
Methode ab, indem SiegetActivity().getIntent()
. In beiden Fällen können Sie die erforderlichen Informationen für diese Methode wie oben beschrieben eingeben. - Identifizieren Sie alle anderen Abhängigkeiten oder erwarteten Absichtsaktionen im alten Fragment, bevor Sie die alten Fragmente und XML-Dateien bereinigen. In diesem Fall verweist ein Overlay-Konfigurationswert auf die alte Aktivität, die aktualisiert werden muss, um auf die richtige Aktivität zu verweisen.
Fügen Sie der Hierarchie einen Einstellungsbildschirm hinzu
Informationen zum Hinzufügen eines neuen Einstellungsbildschirms zur Hierarchie finden Sie unter Fahrzeugeinstellungen hinzufügen .
Nachdem Sie den neuen Präferenzbildschirm erstellt haben, verwenden Sie die obigen Beispiele, um die Präferenzhierarchie wie gewünscht neu anzuordnen.