Đối với hầu hết các phần, việc sắp xếp lại hệ phân cấp Cài đặt tương đối đơn giản và thường bao gồm việc di chuyển tuỳ chọn ưu tiên và PreferenceController
có liên quan sang một tệp XML khác. Nếu PreferenceController
sử dụng use(...)
, hãy nhớ xoá use(...)
khỏi SettingsFragment
trước đó và thêm vào SettingsFragment
mới.
Trang này cung cấp các ví dụ về cách sắp xếp lại phần Cài đặt để xem xét các tình huống có thể xảy ra.
Di chuyển một tuỳ chọn cơ bản
Ví dụ này giải thích cách di chuyển một tuỳ chọn từ màn hình tuỳ chọn này sang màn hình tuỳ chọn khác, trong đó tuỳ chọn chỉ có một trình điều khiển tuỳ chọn mặc định. Trong ví dụ này, bạn sẽ di chuyển tuỳ chọn Đơn vị từ màn hình tuỳ chọn Trang chủ vào màn hình tuỳ chọn Hệ thống. Để thực hiện việc này, hãy di chuyển tệp XML sau từ homepage_fragment.xml
vào vị trí thích hợp trong 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>
Di chuyển một tuỳ chọn sử dụng use(...)
Hãy xem xét ví dụ phức tạp hơn sau đây, trong đó di chuyển tất cả các tuỳ chọn trong mảnh Cảnh báo và giới hạn dữ liệu lên một cấp vào mảnh Mức sử dụng dữ liệu. Mảnh này sẽ cập nhật DataWarningAndLimitFragment.java
để đưa phương thức use
vào để truyền thông tin vào trình điều khiển tuỳ chọn sau khi tạo.
- Di chuyển tệp XML liên quan đến vị trí mong muốn trong
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>
- Trong
DataWarningAndLimitFragment.java
, hãy xác định cách sử dụng phương thứcuse
.@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); } }
Trong trường hợp này, phương thức
use
sẽ đặt trình chỉnh sửa chính sách mạng và mẫu mạng cho các bộ điều khiển lựa chọn ưu tiên. Vì ví dụ này di chuyển tất cả các tuỳ chọn và tất cả mã trong phương thứconAttach
có liên quan đến việc đặt các tham số tuỳ chọn này, nên bạn nên sao chép toàn bộ nội dung phương thức vào mảnh mới. Tuy nhiên, điều này còn tuỳ thuộc vào tuỳ chọn cụ thể. Bạn cũng cần di chuyển các biến thực thể có liên quan.Tuy nhiên, có một vấn đề. Mảnh ban đầu dự kiến sẽ truyền
NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE
dưới dạng đối số, đối số này sẽ đến từ ý định đến hoạt động (khi được cung cấp).Để lấy thông tin cần thiết này, hãy tạo một phương thức
newInstance
và truyền vào mẫu khi có (nếu không, hãy truyền vào giá trị rỗng), sau đó cập nhật hoạt động choDataUsageFragment
hoặc lấy thông tin ý định trực tiếp trong phương thứconAttach
bằng cách sử dụnggetActivity().getIntent()
. Trong cả hai trường hợp, bạn có thể truyền vào thông tin cần thiết cho phương thức này như đã làm ở trên. - Xác định mọi phần phụ thuộc hoặc hành động theo ý định dự kiến khác trong mảnh cũ trước khi dọn dẹp các mảnh cũ và tệp XML. Trong trường hợp này, giá trị cấu hình lớp phủ trỏ đến hoạt động cũ. Bạn phải cập nhật giá trị này để trỏ đến hoạt động chính xác.
Thêm màn hình tuỳ chọn vào hệ phân cấp
Để thêm màn hình tuỳ chọn mới vào hệ thống phân cấp, hãy xem phần Thêm chế độ cài đặt ô tô.
Sau khi tạo màn hình tuỳ chọn mới, hãy sử dụng các ví dụ ở trên để sắp xếp lại hệ phân cấp tuỳ chọn theo ý muốn.