Die Neuordnung der Einstellungen ist in den meisten Fällen relativ einfach und besteht in der Regel darin, die entsprechende Einstellung und PreferenceController
in eine andere XML-Datei zu verschieben. Wenn die PreferenceController
use(...)
verwendet, entfernen Sie sie aus der vorherigen SettingsFragment
und fügen Sie sie der neuen SettingsFragment
hinzu.
Auf dieser Seite finden Sie Beispiele für die Neuanordnung von Einstellungen, um mögliche Situationen zu überprüfen.
Grundeinstellung verschieben
In diesem Beispiel wird erläutert, wie Sie eine Einstellung von einem Einstellungsbildschirm zu einem anderen verschieben, in dem die Einstellung nur einen Standardeinstellungscontroller hat. In diesem Beispiel verschieben Sie die Einstellung „Einheiten“ vom Bildschirm „Startseite“ auf den Bildschirm „System“. Verschieben Sie dazu die folgende XML-Datei von 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>
Einstellung mit „use(...)“ verschieben
Im folgenden, etwas komplexeren Beispiel werden alle Einstellungen im Fragment „Datenwarnung und -limit“ um eine Ebene in das Fragment „Datennutzung“ verschoben. Dadurch wird DataWarningAndLimitFragment.java
um die Methode use
aktualisiert, um nach dem Erstellen Informationen an die Einstellungscontroller weiterzugeben.
- Verschieben Sie die entsprechende XML-Datei an den gewünschten Speicherort 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>
- Legen Sie in
DataWarningAndLimitFragment.java
fest, wie die Methodeuse
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 wird mit der
use
-Methode der Editor für Netzwerkrichtlinien und die Netzwerkvorlage für die Einstellungscontroller festgelegt. Da in diesem Beispiel alle Einstellungen verschoben werden und der gesamte Code in deronAttach
-Methode für die Einstellung dieser Einstellungsparameter relevant ist, ist es sinnvoll, den gesamten Methodeninhalt in das neue Fragment zu kopieren. Das hängt jedoch von der jeweiligen Einstellung ab. Außerdem müssen Sie die relevanten Instanzvariablen verschieben.Es gibt jedoch ein Problem. Im ursprünglichen Fragment wird erwartet, dass
NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE
als Argument übergeben wird. Dieses Argument sollte von der Absicht an die Aktivität übergeben werden (falls vorhanden).Um diese erforderlichen Informationen zu erhalten, können Sie entweder eine
newInstance
-Methode erstellen und die Vorlage übergeben, falls vorhanden (andernfalls „null“ übergeben), und dann die Aktivität für dieDataUsageFragment
aktualisieren oder die Intent-Informationen direkt in deronAttach
-Methode mithilfe vongetActivity().getIntent()
abrufen. In beiden Fällen kannst du die erforderlichen Informationen für diese Methode wie oben beschrieben übergeben. - Identifizieren Sie alle anderen Abhängigkeiten oder erwarteten Intent-Aktionen 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, damit sie auf die richtige Aktivität verweist.
Hierarchie um einen Einstellungsbildschirm ergänzen
Informationen zum Hinzufügen eines neuen Einstellungsbildschirms zur Hierarchie finden Sie unter Autoeinstellungen hinzufügen.
Nachdem Sie den neuen Einstellungsbildschirm erstellt haben, können Sie die Einstellungshierarchie anhand der Beispiele oben nach Belieben neu anordnen.