在大多數情況下,重新排列設置層次結構相對簡單,通常包括將相關首選項和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
方法。
- 將相關的 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 文件之前,識別舊片段中的任何其他依賴項或預期的意圖操作。在這種情況下, 覆蓋配置值指向舊的活動,必須更新它以指向正確的活動。
將首選項屏幕添加到層次結構
要將新的首選項屏幕添加到層次結構,請參閱添加汽車設置。
創建新的首選項屏幕後,使用上面的示例根據需要重新排列首選項層次結構。