يتم تنفيذ معظم الصفحات في إعدادات السيارة كسلسلة من الأجزاء التي تعمل على توسيع 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
ليشمل النشاط المحدد في الخطوة 4.
مثال
توضح المواد التالية هذه العملية.
- قم بتعريف ملف 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.
- لوضع علامة على النشاط كإعداد محقون، قم بإضافة مرشح الغرض إلى النشاط.
- أخبر تطبيق 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، قم بتضمين نموذج التعليمات البرمجية التالي في ملف 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>