Sắp xếp lại phần Cài đặt ô tô

Đố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.

  1. 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>
  2. Trong DataWarningAndLimitFragment.java, hãy xác định cách sử dụng phương thức 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);
        }
    }

    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ức onAttach 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 cho DataUsageFragment hoặc lấy thông tin ý định trực tiếp trong phương thức onAttach bằng cách sử dụng getActivity().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.

  3. 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.