بیشتر صفحات در تنظیمات خودرو به صورت مجموعهای از قطعات پیادهسازی میشوند که 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>