在大多數情況下,重新排列設定階層的做法相當簡單,通常只需將相關偏好設定和 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(...) 的偏好設定
請考慮下列較複雜的範例,該範例會將「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
方法,並在有範本時傳入 (否則傳入空值),然後更新DataUsageFragment
的活動,或是使用getActivity().getIntent()
在onAttach
方法中直接取得意圖資訊。無論是哪種情況,您都可以像上述方法一樣,傳入此方法所需的資訊。 - 請先找出舊片段中的其他依附元件或預期的意圖動作,再清理舊片段和 XML 檔案。在這種情況下,疊加層設定值會指向舊活動,而您必須更新該值,讓其指向正確的活動。
在階層中新增偏好設定畫面
如要在階層中新增偏好設定畫面,請參閱「新增車輛設定」。
建立新的偏好設定畫面後,請參考上述範例,依照需求重新排列偏好設定階層。