بازآرایی تنظیمات خودرو

در بیشتر موارد، بازآرایی سلسله‌مراتب «تنظیمات» نسبتاً ساده است و معمولاً شامل انتقال اولویت مربوطه و 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 برای ارسال اطلاعات به کنترل‌کننده‌های اولویت پس‌از ساخت باشد.

  1. ‫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>
  2. در 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 به‌روز کنید یا اطلاعات هدف را مستقیماً در روش onAttach بااستفاده از getActivity().getIntent() دریافت کنید. در هر دو مورد، می‌توانید اطلاعات موردنیاز برای این روش را همان‌طور که در بالا انجام دادید، ارسال کنید.

  3. قبل‌از پاک‌سازی قطعه‌های قدیمی و فایل‌های XML، هرگونه وابستگی دیگر یا کنش‌های قصد موردانتظار را در قطعه قدیمی شناسایی کنید. در این مورد، مقدار پیکربندی رونهاد به فعالیت قدیمی اشاره می‌کند که باید به‌روز شود تا به فعالیت صحیح اشاره کند.

افزودن صفحه اولویت به سلسله‌مراتب

برای افزودن صفحه اولویت جدید به سلسله‌مراتب، به افزودن تنظیمات خودرو مراجعه کنید.

پس‌از ایجاد صفحه اولویت جدید، از مثال‌های بالا برای بازآرایی سلسله‌مراتب اولویت‌ها به دلخواه خود استفاده کنید.