در بیشتر موارد، بازآرایی سلسلهمراتب «تنظیمات» نسبتاً ساده است و معمولاً شامل انتقال اولویت مربوطه و 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
برای ارسال اطلاعات به کنترلکنندههای اولویت پساز ساخت باشد.
- 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بهروز کنید یا اطلاعات هدف را مستقیماً در روشonAttachبااستفاده ازgetActivity().getIntent()دریافت کنید. در هر دو مورد، میتوانید اطلاعات موردنیاز برای این روش را همانطور که در بالا انجام دادید، ارسال کنید. - قبلاز پاکسازی قطعههای قدیمی و فایلهای XML، هرگونه وابستگی دیگر یا کنشهای قصد موردانتظار را در قطعه قدیمی شناسایی کنید. در این مورد، مقدار پیکربندی رونهاد به فعالیت قدیمی اشاره میکند که باید بهروز شود تا به فعالیت صحیح اشاره کند.
افزودن صفحه اولویت به سلسلهمراتب
برای افزودن صفحه اولویت جدید به سلسلهمراتب، به افزودن تنظیمات خودرو مراجعه کنید.
پساز ایجاد صفحه اولویت جدید، از مثالهای بالا برای بازآرایی سلسلهمراتب اولویتها به دلخواه خود استفاده کنید.