重新排列汽车设置

在大多数情况下,重新排列“设置”层次结构相对简单,通常包括将相关的偏好设置和 PreferenceController 移动到不同的 XML 文件。如果 PreferenceController 使用 use(...),请务必将其从之前的 SettingsFragment 中移除,并将其添加到新的 SettingsFragment 中。

此页面提供了重新排序“设置”的示例,以供查看可能发生的情况。

移动基本偏好设置

此示例介绍了如何将偏好设置从一个偏好设置屏幕移动到另一个屏幕,其中偏好设置只有一个默认偏好设置控制器。在此示例中,您将“单位”偏好设置从“主页”偏好设置屏幕移动到“系统”偏好设置屏幕中。为此,请将以下 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(...) 的偏好设置

考虑以下更复杂的示例,该示例将“数据警告和限制”片段中的所有偏好设置向上移动一个级别,移动到“数据用量”片段中,这将更新 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 作为参数传入,这应来自活动的 Intent(如果提供)。

    为了获取所需的此信息,可以创建一个 newInstance 方法,并在存在模板时传入该模板(否则传入 null),然后更新 DataUsageFragment 的活动,或者通过使用 getActivity().getIntent()onAttach 方法中直接获取 Intent 信息。无论哪种情况,您都可以像上面那样为此方法传入所需的信息。

  3. 在清理旧片段和 XML 文件之前,先确定旧片段中的任何其他依赖项或预期的 Intent 操作。在本例中,叠加层配置值指向旧活动,必须将其更新为指向正确的活动。

向层次结构添加偏好设置屏幕

要向层次结构添加新的偏好设置屏幕,请参阅添加汽车设置

创建新的偏好设置屏幕后,使用上述示例根据需要重新排列偏好设置层次结构。