W większości przypadków zmiana hierarchii ustawień jest stosunkowo prosta i polega na przeniesieniu odpowiednich ustawień i elementów PreferenceController
do innego pliku XML. Jeśli w dodatku PreferenceController
używasz use(...)
, usuń go z poprzedniej SettingsFragment
i dodaj do nowej SettingsFragment
.
Na tej stronie znajdziesz przykłady zmiany kolejności ustawień w różnych sytuacjach.
Przenoszenie podstawowej preferencji
Ten przykład pokazuje, jak przenieść ustawienie z jednego ekranu ustawień na inny, na którym ma ono tylko domyślny kontroler ustawień. W tym przykładzie przenosisz ustawienie Jednostki z ekranu ustawień Strona główna na ekran ustawień System. Aby to zrobić, przenieś ten kod XML z katalogu homepage_fragment.xml
do odpowiedniego miejsca w katalogu 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>
Przenoszenie ustawienia, które używa funkcji use(...)
Rozważmy bardziej złożony przykład, w którym wszystkie ustawienia w fragmentach Ostrzeżenie o danych i Ograniczenie przesuwamy o jeden poziom w dół do fragmentu Korzystanie z danych. W ten sposób metoda DataWarningAndLimitFragment.java
zostanie zaktualizowana, aby zawierała metodę use
, która przekazuje informacje do kontrolerów ustawień po utworzeniu.
- Przenieś odpowiedni plik XML do wybranej lokalizacji w sekcji
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, jak używać 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ż w tym przykładzie wszystkie ustawienia i cały kod w metodieonAttach
są istotne dla ustawiania tych parametrów, warto skopiować całą zawartość metody do nowego fragmentu. Może się to jednak różnić w zależności od konkretnej preferencji. Musisz też przenieść odpowiednie zmienne instancji.Jest jednak pewien problem. Pierwotny fragment, który powinien być przekazany jako argument
NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE
, powinien pochodzić z intencji do aktywności (jeśli jest podany).Aby uzyskać te informacje, utwórz metodę
newInstance
i przekaż w niej szablon, jeśli jest obecny (w przeciwnym razie prześlij null), a następnie zaktualizuj aktywność dlaDataUsageFragment
lub pobierz informacje o intencji bezpośrednio w metodieonAttach
, używając do tego metodygetActivity().getIntent()
. W obu przypadkach możesz przekazać informacje wymagane w przypadku tej metody, tak jak w powyższym przykładzie. - Zanim usuniesz stare fragmenty i pliki XML, zidentyfikuj inne zależności lub oczekiwane działania związane z intencją w starym fragmencie. W tym przypadku wartość konfiguracji nakładki wskazuje na starą aktywność, którą należy zaktualizować, aby wskazywała na właściwą aktywność.
Dodawanie ekranu ustawień do hierarchii
Aby dodać nowy ekran preferencji do hierarchii, zapoznaj się z artykułem Dodawanie ustawień samochodu.
Po utworzeniu nowego ekranu ustawień możesz na podstawie powyższych przykładów zmienić hierarchię ustawień.