在大多数情况下,重新排列设置层次结构相对简单,通常包括将相关首选项和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
方法。
- 将相关 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
方法中的所有代码都与设置这些首选项参数相关,因此将整个方法内容复制到新片段中是合适的。然而,这取决于具体偏好。您还需要移动相关的实例变量。然而,有一个复杂的情况。原始片段期望
NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE
作为参数传入,该参数应该从意图到活动(如果提供)。要获取所需的信息,请创建一个
newInstance
方法并在模板存在时传入(否则传入 null),然后更新DataUsageFragment
的活动,或者使用getActivity().getIntent()
在onAttach
方法中直接获取意图信息getActivity().getIntent()
。无论哪种情况,您都可以像上面那样传递此方法所需的信息。 - 在清理旧片段和 XML 文件之前,确定旧片段中的任何其他依赖项或预期意图操作。在这种情况下, 覆盖配置值指向旧的活动,必须更新该值以指向正确的活动。
将首选项屏幕添加到层次结构中
要将新的首选项屏幕添加到层次结构,请参阅添加汽车设置。
创建新的首选项屏幕后,使用上面的示例根据需要重新排列首选项层次结构。