اکثر صفحههای «تنظیمات خودرو» بهصورت مجموعهای از
تکههایی پیادهسازی شدهاند که SettingsFragment را گسترش میدهند،
و هریک از آنها فعالیت خود را در CarSettingActivities تعریف کردهاند.
این فعالیتهای ایستا از BaseCarSettingsActivity گسترش یافتهاند.
علاوهبر این تنظیمات، میتوانید اولویتهایی را از برنامههای سیستم دیگر تزریق کنید تا در «تنظیمات خودرو» نشان داده شوند.
افزودن اولویت جدید در «تنظیمات خودرو»
برای افزودن تنظیم جدید:
- فایل XML را تعریف کنید:
- مطمئن شوید همه اولویتها
android:keyتعریفشده داشته باشند. فهرست کلیدها درpreference_keys.xmlنگهداری میشود. کلیدهای اولویتها باید یکتا باشد. - برای اهداف نمایهگذاری جستجو، صفحههای اولویت باید
android:keyتعریفشدهای نیز داشته باشند. فهرست کلیدهای صفحه اولویت درpreference_screen_keys.xmlنگهداری میشود. کلیدهای صفحه «ترجیحات» نیز باید منحصربهفرد باشند. - اگر اولویت فقط اطلاعات ایستا را نمایش میدهد (برای مثال،
منطق کسبوکار ویژه ندارد)، کنترلکننده اولویت را روی
com.android.car.settings.common.DefaultRestrictionsPreferenceControllerتنظیم کنید. - اگر اولویت به منطق کسبوکار نیاز دارد، کنترلکننده اولویت را با نام کنترلکننده اولویت جدید تنظیم کنید.
- مطمئن شوید همه اولویتها
- (درصورت نیاز) کنترلکننده اولویت را در بسته
مناسبی که
PreferenceControllerرا گسترش میدهد ایجاد کنید. درصورت نیاز، Javadoc را ببینید. - قطعهای با
getPreferenceScreenResIdبسازید که فایل XML تعریفشده در «مرحله ۱» را برمیگرداند. - فعالیتی در
CarSettingActivitiesایجاد کنید کهBaseCarSettingsActivityرا گسترش دهد و سپسgetInitialFragment()را پیادهسازی کنید و قطعه تعریفشده در «مرحله ۳» را برگردانید. -
AndroidManifest.xmlرا بهروز کنید تا فعالیت تعریفشده در «مرحله ۴» را دربر بگیرد.
مثال
مطالب زیر این فرایند را نشان میدهد.
- فایل XML بهنام
demo_fragment.xmlرا تعریف کنید:<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:title="@string/demo_label" android:key="@string/psk_demo"> <Preference android:icon="@drawable/ic_settings_demo_preference_1" android:key="@string/pk_demo_preference_1" android:title="@string/demo_preference_1_title" settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"> <intent android:targetPackage="com.android.car.settings" android:targetClass="com.android.car.settings.common.CarSettingActivities$DemoSetting1Activity"/> </Preference> <Preference android:icon="@drawable/ic_settings_demo_preference_2" android:key="@string/pk_demo_preference_2" android:title="@string/demo_preference_2_title" settings:controller="com.android.car.settings.example.MyCustomRestrictionsPreferenceController"> <intent android:targetPackage="com.android.car.settings" android:targetClass="com.android.car.settings.common.CarSettingActivities$DemoSetting2Activity"/> </Preference> </PreferenceScreen>
- کلیدهای اولویت را به
preference_keysاضافه کنید:<resources> [...] <string name="pk_demo_preference_1" translatable="false">demo_preference_1</string> <string name="pk_demo_preference_2" translatable="false">demo_preference_2</string> </resources> - کلید صفحه اولویت را به
preference_screen_keys.xmlاضافه کنید:<resources> [...] <string name="psk_demo" translatable="false">demo_screen</string> </resources>برای اولویت مثال اول، از
DefaultRestrictionsPreferenceControllerاستفاده کنید. برای اولویت دوم، از کنترلکننده اولویت سفارشی استفاده کنید که باید تعریف شود. برای این مثال، میتوانید این اولویت را برای کاربران سرپرست دردسترس فقط سفارشیسازی کنید. برای انجام این کار، کنترلکننده سفارشی زیر را تعریف کنید:public class MyCustomRestrictionsPreferenceController extends PreferenceController<Preference> { private final UserManager mUserManager; public MyCustomRestrictionsPreferenceController(Context context, String preferenceKey, FragmentController fragmentController, CarUxRestrictions uxRestrictions) { super(context, preferenceKey, fragmentController, uxRestrictions); mUserManager = UserManager.get(context); } @Override protected Class<Preference> getPreferenceType() { return Preference.class; } @Override public int getAvailabilityStatus() { return mUserManager.isAdminUser() ? AVAILABLE : DISABLED_FOR_USER; } }
- برای ایجاد یک تکهبرنامه،
getPreferenceScreenResIdرا ملغی کنید: - برای نگهداشتن تکه جدید، فعالیتی در
CarSettingActivitiesایجاد کنید: - فایل مانیفست را با فعالیت جدید بهروز کنید:
- مستقیماً در برنامه CarSettings پیادهسازی نشده است (مثلاً تزریق تنظیم پیادهسازیشده توسط سازندگان اصلی محصول).
- باید در برنامه «تنظیمات خودرو» نشان داده شود.
- برای علامتگذاری فعالیت بهعنوان تنظیم تزریقشده، فیلتر هدف به فعالیت اضافه کنید.
- به برنامه CarSettings بگویید که به کدام دسته تعلق دارد. دسته یک ثابت است که در
CategoryKeyتعریف شده است و برای نشان دادن اینکه تنظیم تزریقشده باید در کدام سطح از «تنظیمات خودرو» نشان داده شود استفاده میشود. مجموعهای از دستهها را درCategoryKeyارائه میدهیم، اما هیچ محدودیتی برای تعریف دستههای خود ازسوی سازندگان تجهیزات اصلی وجود ندارد. - (اختیاری) وقتی تنظیم نمایش داده میشود، نوشتار خلاصه اضافه کنید:
<activity android:name="Settings$DemoSettingsActivity" <!-- Mark the activity as an injected setting --> <intent-filter> <action android:name="com.android.settings.action.EXTRA_SETTINGS"/> </intent-filter> <!-- Tell CarSettings app which category it belongs to --> <meta-data android:name="com.android.settings.category" android:value="com.android.settings.category.demo_category"/> <!-- Tell CarSettings the what the preference title should be --> <meta-data android:name="com.android.settings.title" android:value="@string/app_name" /> <!-- Optional: specify the icon to show with the preference --> <meta-data android:name="com.android.settings.icon" android:resource="@drawable/ic_demo" android:value="true"/> <!-- Optional: Add a summary text when the string is displayed --> <meta-data android:name="com.android.settings.summary" android:resource="@string/demo_summary"/> </activity>
public class DemoFragment extends SettingsFragment { @Override @XmlRes protected int getPreferenceScreenResId() { return R.xml.demo_fragment; } }
public class CarSettingActivities { [...] public static class DemoActivity extends BaseCarSettingsActivity { @Nullable @Override protected Fragment getInitialFragment() { return new DemoFragment(); } } }
<application [...] <activity android:name=".common.CarSettingActivities$DemoActivity" android:exported="true"> <meta-data android:name="distractionOptimized" android:value="true"/> </activity> [...] </application>
اولویت هدف خارجی را در «تنظیمات خودرو» اضافه کنید
بهعنوان جایگزینی برای اولویتهای تزریقشده، همچنین میتوانید اولویتی را مستقیماً در «تنظیمات خودرو» درج کنید که به برنامه دیگری هدایت شود. این کار را میتوانید با افزودن اولویت به صفحه اولویت با کنش هدفی که به برنامه خارجی هدایت میشود انجام دهید. مانند سایر اولویتهای «تنظیمات خودرو»، این اولویتها نیز همان مشخصههای XML را دارند.
<Preference android:key="@string/pk_demo_preference" android:title="@string/demo_preference_title" android:summary="@string/demo_preference_summary" settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"> <intent android:action="android.intent.action.DEMO_ACTION"/> </Preference>
افزودن اولویت تزریقی
اولویتهای تزریقشده حاوی هدفهایی است که به فعالیتهای خارجی یا داخلی منتهی میشود. بهعنوان مثال، مورد تنظیم Google در صفحه اصلی «تنظیمات» یک اولویت تزریقشده است. اولویتهای تزریقی بهویژه زمانی مفید هستند که هریک از موارد زیر درست باشد. تنظیم:
برای پیکربندی فعالیت بهعنوان تنظیم تزریقی:
برای اینکه تنظیم تزریقشده در صفحهای خاص در برنامه CarSettings نشان داده شود، کد نمونه زیر را در «زبان نشانهگذاری توسعهپذیر» بگنجانید و متغیرها را درصورت لزوم اصلاح کنید:
<com.android.car.settings.common.LogicalPreferenceGroup <!-- Replace key string --> android:key="@string/pk_system_extra_settings" <!-- Indicates the preferences in the group should be injected in. ExtraSettingsPreferenceController contains the logic to pull in injected preferences. --> settings:controller="com.android.settings.common.ExtraSettingsPreferenceController"> <!-- Tells the controller what activities should be pulled into this preference group. --> <intent android:action="com.android.settings.action.EXTRA_SETTINGS"> <!-- Name and value should match the metadata in your activity --> <extra android:name="com.android.settings.category" android:value="com.android.settings.category.demo_category"/> </intent> </com.android.car.settings.common.LogicalPreferenceGroup>