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

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