Zmień ustawienia samochodu

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.

  1. 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>
    
  2. W DataWarningAndLimitFragment.java określ sposób użycia 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ż ten przykład przenosi wszystkie preferencje, a cały kod metody onAttach 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 dla DataUsageFragment lub uzyskaj informacje o zamiarze bezpośrednio w metodzie onAttach za pomocą metody getActivity().getIntent() . W obu przypadkach możesz przekazać informacje potrzebne do tej metody, tak jak to zrobiłeś powyżej.

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