بیشتر صفحات در تنظیمات خودرو به صورت مجموعهای از قطعات پیادهسازی میشوند که SettingsFragment گسترش میدهند و هر یک از آنها فعالیت خاص خود را در CarSettingActivities تعریف میکنند. این فعالیت های ایستا از BaseCarSettingsActivity گسترش یافته است. علاوه بر این تنظیمات، میتوانید تنظیمات برگزیده را از سایر برنامههای سیستم برای نمایش در CarSettings تزریق کنید.
یک اولویت جدید در تنظیمات خودرو اضافه کنید
برای افزودن یک تنظیم جدید:
- تعریف فایل XML:
- مطمئن شوید که همه تنظیمات برگزیده
android:keyرا تعریف کرده اند. لیست کلیدها درpreference_keys.xmlنگهداری می شود. کلیدهای ترجیحی باید منحصر به فرد باشند. - برای اهداف فهرستسازی جستجو، صفحههای ترجیحی باید دارای یک
android:keyتعریفشده باشند. لیست کلیدهای صفحه ترجیحی درpreference_screen_keys.xmlنگهداری می شود. کلیدهای صفحه ترجیحی نیز باید منحصر به فرد باشند. - اگر تنظیمات برگزیده فقط اطلاعات ثابت را نشان می دهد (به عنوان مثال، هیچ منطق تجاری خاصی وجود ندارد)، کنترل کننده ترجیحی را به عنوان
com.android.car.settings.common.DefaultRestrictionsPreferenceControllerتنظیم کنید. - اگر اولویت به منطق تجاری نیاز دارد، کنترل کننده ترجیحی را با نام کنترل کننده ترجیحی جدید تنظیم کنید.
- مطمئن شوید که همه تنظیمات برگزیده
- ( در صورت نیاز ) کنترل کننده ترجیحی را در بسته مناسب ایجاد کنید که
PreferenceControllerگسترش می دهد. در صورت نیاز به Javadoc مراجعه کنید. - یک قطعه با
getPreferenceScreenResIdایجاد کنید که فایل XML تعریف شده در مرحله 1 را برمی گرداند. - یک اکتیویتی در
CarSettingActivitiesایجاد کنید کهBaseCarSettingsActivityگسترش دهد و سپسgetInitialFragment()را پیاده سازی کنید و قطعه تعریف شده در مرحله 3 را برگردانید. -
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 پیادهسازی نمیشود (مانند تزریق تنظیماتی که توسط OEMها اجرا میشود).
- باید در برنامه CarSettings ظاهر شود.
- برای علامت گذاری فعالیت به عنوان یک تنظیم تزریقی، یک فیلتر قصد به فعالیت اضافه کنید.
- به برنامه CarSettings بگویید به کدام دسته تعلق دارد. این دسته یک ثابت است که در
CategoryKeyتعریف شده است و برای نشان دادن اینکه تنظیمات تزریق شده در کدام سطح از CarSettings باید ظاهر شود استفاده می شود. ما مجموعه ای از دسته ها را درCategoryKeyارائه می دهیم، اما هیچ محدودیتی برای OEM ها برای تعریف دسته های خود وجود ندارد. - ( اختیاری ) هنگامی که تنظیمات نمایش داده می شود، متن خلاصه را اضافه کنید:
<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 ظاهر شود، کد نمونه زیر را در XML وارد کنید و در صورت لزوم متغیرها را تغییر دهید:
<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>