إضافة إعدادات السيارة

يتم تنفيذ معظم الصفحات في "إعدادات السيارة" كسلسلة من المقاطع التي تمتد إلى SettingsFragment، مع تحديد نشاط لكل منها في CarSettingActivities. تم تمديد هذه الأنشطة الثابتة من BaseCarSettingsActivity. بالإضافة إلى هذه الإعدادات، يمكنك إدخال الإعدادات المفضّلة من تطبيقات النظام الأخرى ل ظهورها في CarSettings.

إضافة إعداد مفضّل جديد في "إعدادات السيارة"

لإضافة إعداد جديد:

  1. تحديد ملف XML:
    1. تأكَّد من أنّ جميع الإعدادات المفضّلة قد تم تحديد android:key لها. يتم الاحتفاظ بقائمة المفاتيح في preference_keys.xml. يجب أن تكون مفاتيح الإعدادات المفضّلة فريدة.
    2. لأغراض فهرسة البحث، يجب أن تتضمّن شاشات الإعدادات المفضّلة أيضًا android:key محدّدًا. يتم الاحتفاظ بقائمة مفاتيح شاشة الإعدادات المفضّلة في preference_screen_keys.xml. يجب أن تكون مفاتيح شاشة الإعدادات المفضّلة فريدة أيضًا.
    3. إذا كان الخيار المفضّل يعرض معلومات ثابتة فقط (مثل، ما مِن منطق عمل خاص)، اضبط وحدة التحكّم في الخيار المفضّل على com.android.car.settings.common.DefaultRestrictionsPreferenceController.
    4. إذا كانت الإعدادات المفضّلة تتطلّب منطق النشاط التجاري، اضبط عنصر التحكّم في الإعدادات المفضّلة باستخدام اسم جديد لعنصر التحكّم في الإعدادات المفضّلة.
  2. (إذا لزم الأمر) أنشئ وحدة التحكّم في الإعدادات المفضّلة في الحزمة المناسبة التي تمتد إلى PreferenceController. اطّلِع على Javadoc إذا لزم الأمر.
  3. أنشئ مقتطفًا يتضمّن getPreferenceScreenResId لعرضملف XML الذي تم تحديده في الخطوة 1.
  4. أنشئ نشاطًا في CarSettingActivities يتضمّن BaseCarSettingsActivity ثم نفِّذ getInitialFragment()، مع عرض المقتطف الذي تم تحديده في الخطوة 3.
  5. عدِّل AndroidManifest.xml لتضمين النشاط المحدّد في الخطوة 4.

مثال

توضِّح المادة التالية هذه العملية.

  1. حدِّد ملف 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>
  2. أضِف مفاتيح الإعدادات المفضّلة إلى 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>
  3. أضِف مفتاح شاشة الإعدادات المفضّلة إلى 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;
        }
    }
  4. لإنشاء مقتطف، يمكنك إلغاء getPreferenceScreenResId:
  5. public class DemoFragment extends SettingsFragment {
    
        @Override
        @XmlRes
        protected int getPreferenceScreenResId() {
            return R.xml.demo_fragment;
        }
    }
  6. للاحتفاظ بالجزء الجديد، أنشئ نشاطًا في CarSettingActivities:
  7. public class CarSettingActivities {
        [...]
        public static class DemoActivity extends BaseCarSettingsActivity {
            @Nullable
            @Override
            protected Fragment getInitialFragment() {
                return new DemoFragment();
            }
        }
    }
  8. عدِّل ملف البيان لتضمين النشاط الجديد:
  9. <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 (مثل إدخال إعداد ينفذه المصنّعون الأصليون للأجهزة)
    • من المفترض أن يظهر في تطبيق CarSettings.

    لضبط نشاط كإعداد مُدرَج:

    1. لوضع علامة على النشاط باعتباره إعدادًا تمّ إدراجه، أضِف فلتر أهداف إلى النشاط.
    2. حدِّد الفئة التي ينتمي إليها تطبيق CarSettings. الفئة هي قيمة ثابتة تم تحديدها في CategoryKey، ويُستخدَم لتحديد المستوى الذي يجب أن يظهر فيه الإعداد المُدرَج في CarSettings. نوفّر مجموعة من الفئات في CategoryKey، ولكن لا توجد قيود على المصنّعين الأصليّين للأجهزة لتحديد فئاتهم الخاصة.
    3. (اختياري) أضِف نصًا تلخيصيًا عند عرض الإعداد:
      <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>

    لظهور الإعداد المُدرَج في صفحة معيّنة في تطبيق 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>