W większości przypadków zmiana hierarchii ustawień jest stosunkowo prosta i zazwyczaj polega na przeniesieniu odpowiednich preferencji i PreferenceController
do innego pliku XML. Jeśli PreferenceController
używa use(...)
, pamiętaj o usunięciu go z poprzedniego SettingsFragment
i dodaj go do nowego SettingsFragment
.
Na tej stronie znajdują się przykłady zmiany kolejności Ustawień w celu przeglądu sytuacji, które mogą wystąpić.
Przenieś podstawowe preferencje
Ten przykład wyjaśnia, jak przenieść preferencję z jednego ekranu preferencji na inny, w którym preferencja ma tylko domyślny kontroler preferencji. W tym przykładzie przenosisz preferencje Jednostki z ekranu preferencji Strony głównej na ekran preferencji System. Aby to zrobić, przenieś następujący plik XML z homepage_fragment.xml
do odpowiedniej lokalizacji w 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>
Przenieś preferencję korzystającą z funkcji use(...)
Rozważmy następujący, bardziej złożony przykład, który przenosi wszystkie preferencje we fragmencie Data Warning & Limit o jeden poziom wyżej do fragmentu Data Usage, który aktualizuje DataWarningAndLimitFragment.java
w celu uwzględnienia metody use
do przekazywania informacji do kontrolerów preferencji po skonstruowaniu.
- Przenieś odpowiedni plik XML do żądanej lokalizacji w
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>
- W
DataWarningAndLimitFragment.java
określ sposób użycia metodyuse
.@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); } }
W tym przypadku metoda
use
ustawia edytor zasad sieciowych i szablon sieci dla kontrolerów preferencji. Ponieważ ten przykład przenosi wszystkie preferencje, a cały kod metodyonAttach
ma znaczenie przy ustawianiu tych parametrów preferencji, właściwym byłoby skopiowanie całej zawartości metody do nowego fragmentu. Różni się to jednak w zależności od konkretnych preferencji. Musisz także przejść nad odpowiednimi zmiennymi instancji.Istnieje jednak komplikacja. Oryginalny fragment oczekiwał przekazania
NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE
jako argumentu, który powinien pochodzić z intencji do działania (jeśli został podany).Aby uzyskać te potrzebne informacje, utwórz metodę
newInstance
i przekaż szablon, jeśli jest obecny (w przeciwnym razie podaj wartość null), a następnie zaktualizuj działanie dlaDataUsageFragment
lub uzyskaj informacje o zamiarze bezpośrednio w metodzieonAttach
za pomocą metodygetActivity().getIntent()
. W obu przypadkach możesz przekazać informacje potrzebne do tej metody, tak jak to zrobiłeś powyżej. - Zidentyfikuj wszelkie inne zależności lub oczekiwane działania w starym fragmencie przed wyczyszczeniem starych fragmentów i plików XML. W tym przypadku wartość konfiguracji nakładki wskazuje na stare działanie, które należy zaktualizować, aby wskazywało prawidłowe działanie.
Dodaj ekran preferencji do hierarchii
Aby dodać nowy ekran preferencji do hierarchii, zobacz Dodawanie ustawień samochodu .
Po utworzeniu nowego ekranu preferencji skorzystaj z powyższych przykładów, aby odpowiednio uporządkować hierarchię preferencji.