Zmiana kolejności ustawień samochodu

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.

  1. 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>
  2. DataWarningAndLimitFragment.java określ, jak używać metody use.
    @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 metodie onAttach 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ść dla DataUsageFragment lub pobierz informacje o intencji bezpośrednio w metodie onAttach, używając do tego metody getActivity().getIntent(). W obu przypadkach możesz przekazać informacje wymagane w przypadku tej metody, tak jak w powyższym przykładzie.

  3. 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ń.