在大多数情况下,重新排列“设置”层次结构的过程相对简单,通常涉及将相关偏好设置和 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(...)
的偏好设置
注意下面这个较为复杂的示例,在该示例中,“数据流量警告和上限”Fragment 中的所有偏好设置都移动到上一级的“流量消耗”Fragment 中,后者更新 DataWarningAndLimitFragment.java
以包含 use
方法,从而在构建后将信息传递到偏好设置控制器。
- 将相关的 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>
- 在
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
方法中的所有代码都与设置这些偏好设置参数相关,因此将整个方法内容复制到新的 fragment 中比较合适。但是,这具体取决于特定偏好设置。此外,您还需要移动相关实例变量。不过,还存在一个复杂问题。原始 Fragment 应以参数的形式传入
NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE
,该参数应从 intent 传递到 Activity(如果提供)。如需获取该所需信息,请创建
newInstance
方法,并传入模板(如存在,否则传入 null),然后更新DataUsageFragment
的 Activity,或使用getActivity().getIntent()
直接在onAttach
方法中获取 intent 信息。无论是哪种情况,您都可以按上述方式传入此方法所需的信息。 - 在清理旧 Fragment 和 XML 文件之前,请确定旧 Fragment 中的任何其他依赖项或预期 intent 操作。在这种情况下,叠加层配置值指向旧 Activity,更新后才能指向正确的 Activity。
向层次结构添加偏好设置屏幕
如需向层次结构添加新的偏好设置屏幕,请参阅添加汽车设置。
创建新的偏好设置屏幕后,您可以按照上面的示例,根据需要调整偏好设置层次结构。