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

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

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

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

  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>
    

    إضافة تفضيل خارجي حسب النية بالشراء في "إعدادات السيارة"

    وكبديل للتفضيلات التي تم إدخالها، من الممكن أيضًا: إدراج تفضيل مباشرةً في إعدادات السيارة المقصودة إلى تطبيق آخر. ويمكن إجراء ذلك عن طريق إضافة تفضيل إلى شاشة الإعدادات المفضّلة مع إجراء intent الذي يتم نقله إلى التطبيق. مثل التفضيلات الأخرى في إعدادات السيارة، فإن هذه التفضيلات تضم نفس سمات 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>