重新安排汽車設置

在大多數情況下,重新排列設置層次結構相對簡單,通常包括將相關首選項和PreferenceController移動到不同的 XML 文件。如果PreferenceController使用use(...) ,請務必將其從之前的SettingsFragment中刪除,並將其添加到新的SettingsFragment中。

本文提供了重新排序設置以查看可能發生的情況的示例。

移動基本首選項

此示例說明如何將首選項從一個首選項屏幕移動到另一個,其中首選項只有一個默認首選項控制器。在本例中,您將 Units 首選項從 Homepage 首選項屏幕移至 System 首選項屏幕。為此,請將以下 XML 從homepage_fragment.xml移動到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>

移動使用use(...)的首選項

考慮以下更複雜的示例,它將 Data Warning & Limit 片段中的所有首選項上移一級到 Data Usage 片段中,該片段更新DataWarningAndLimitFragment.java以包含在構造後將信息傳遞到首選項控制器的use方法。

  1. 將相關的 XML 移動到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中,確定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);
        }
    }
    

    在這種情況下, use方法為偏好控制器設置網絡策略編輯器和網絡模板。因為此示例移動了所有首選項,並且onAttach方法中的所有代碼都與設置這些首選項參數相關,所以將整個方法內容複製到新片段中是合適的。但是,這取決於特定的偏好。您還需要移動相關的實例變量。

    但是,有一個並發症。原始片段期望NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE作為參數傳入,它應該從意圖傳入活動(如果提供)。

    要獲取此所需信息,請創建一個newInstance方法並在存在時傳入模板(否則傳入 null),然後更新DataUsageFragment的活動或使用getActivity().getIntent()onAttach方法中直接獲取意圖信息getActivity().getIntent() .無論哪種情況,您都可以像上面那樣傳遞此方法所需的信息。

  3. 在清理舊片段和 XML 文件之前,識別舊片段中的任何其他依賴項或預期的意圖操作。在這種情況下, 覆蓋配置值指向舊的活動,必須更新它以指向正確的活動。

將首選項屏幕添加到層次結構

要將新的首選項屏幕添加到層次結構,請參閱添加汽車設置

創建新的首選項屏幕後,使用上面的示例根據需要重新排列首選項層次結構。