نظرة عامة

يتم توفير "إعدادات السيارة" (packages/apps/Car/Settings) خصيصًا لنظام التشغيل Android Automotive (AAOS). تختلف "إعدادات السيارة" عن "إعدادات الهاتف" (packages/apps/Settings). على الرغم من أنّ "إعدادات السيارة" تحتوي على بعض إعدادات الهاتف المألوفة، توفّر "إعدادات السيارة" واجهة مستخدم مرئية مخصّصة للسيارة، وتحسينات لتجنّب تشتيت انتباه السائق، والعديد من نقاط الدخول المخصّصة لمصنّعي السيارات.

بالإضافة إلى النظرة العامة على "إعدادات السيارة" الواردة أدناه، يمكنك الاطّلاع على topics التالية ذات الصلة للتعرّف على مزيد من المعلومات حول "إعدادات السيارة":

التصميم والإرشادات

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

الإعدادات المفضّلة الثابتة

يتم تحديد الإعدادات المفضّلة الثابتة في ملف XML باستخدام علامة Preference أو CarUiPreference. يستخدم تطبيق SettingsFragment طريقة getPreferenceScreenResId() لتحديد ملف XML الذي يحتوي على القائمة الثابتة للإعدادات المفضّلة التي سيتم عرضها.

الخيارات المفضّلة الديناميكية

تستخدِم الإعدادات المفضّلة الديناميكية علامة PreferenceGroup أو إحدى عمليات تنفيذ PreferenceGroup.

في تطبيق CarSettings، تمثّل الإعدادات المفضّلة الديناميكية مجموعة عادية من الإعدادات المفضّلة التي توجّه المستخدم إلى صفحات إضافية ضمن CarSettings، ولكن تمّت إضافتها من خلال Preference Controller بدلاً من XML. ومن الأمثلة على ذلك الإعداد المفضَّل "إدارة لوحات المفاتيح" ضمن الإعداد المفضَّل "اللغات والإدخال" الذي يضيف أساليب إدخال بشكل ديناميكي إلى صفحة الإعدادات المفضَّلة استنادًا إلى ما إذا كانت أساليب الإدخال هذه مسموحًا بها أم لا.

أشرطة الإجراءات

يتضمّن أعلى كل شاشة إعدادات شريط إجراءات يمكن أن يحتوي على زر تنقّل "الرجوع" وعنوان شاشة وتطبيقات مصغّرة إضافية للإجراءات (مثل الزرّات والمفاتيح). تشبه أشرطة الإجراءات هذه ActionBar التي يوفّرها Android، ولكنها في الواقع عروض مخصّصة. في الإصدار 11 من Android والإصدارات الأحدث، يتم تضمين شريط الأدوات هذا في تنسيق قاعدة الهيكل الذي يحتوي على طرق عرض لشريط الأدوات وتنسيق إطار لبقية محتوى التطبيق.

التطبيقات المصغّرة للإجراءات التكميلية هي فئات MenuItem ويجب إنشاؤها في onCreate من SettingsFragment أو BaseFragment المعنيّ. يجب أن تتحكم وظائف الإعداد في الخصائص، مثل مستوى العرض والحالة وما إلى ذلك، في منطق العمل الخاص بالعنصر SettingsFragment.

// ExampleSettingsFragment.java
public class ExampleSettingsFragment extends SettingsFragment {

    @Override
    protected List<MenuItem> getToolbarMenuItems() {
        return Collections.singletonList(mClearConfirmButton);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mButton = new MenuItem.Builder(getContext())
                .setTitle(R.string.text)
                .setOnClickListener(mOnClickListener)
                .setUxRestrictions(CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP)
                .build();
    }

    private void updateState() {
        button.setVisible(false);
    }
}

تتيح لك أشرطة الإجراءات استخدام ميزة تحسين تشتيت الانتباه في إعدادات السيارة. اضبط UXRestrictions في MenuItem.Builder عند الإنشاء.

عناصر التحكّم في الإعدادات المفضّلة

يمكن أن تحتوي كل صفحة إعدادات على عدد من الإعدادات المفضّلة المختلفة.

اطّلِع على الصورة التالية لمعرفة كيفية ارتباط هذه المكوّنات ببعضها:

مكونات CarSettings

الشكل 1: مكونات CarSettings

PreferenceController هو مكوّن يراعي مراحل النشاط التجاري ويساعد في تجميع منطق النشاط التجاري المرتبط بإعدادات مفضّلة معيّنة. لا يمكن إرفاق PreferenceControllers بالخيار المفضّل ذي الصلة إلا من خلال ملف XML.

// example_settings_fragment.xml
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res-auto"
    android:title="@string/example_settings_title">
  <Preference
    android:key="@string/pk_example_preference_key"
    android:title="@string/example_preference_title"
    settings:controller="com.android.car.settings.example.ExamplePreferenceController"/>
</PreferenceScreen>

تمنع إعدادات السيارة صراحةً إنشاء PreferenceController من خلال الرمز من أجل تسهيل تعديل التسلسل الهرمي للإعدادات بأقل possible تغييرات على رمز Java.

من المحتمل أنّ PreferenceController يحتاج إلى بعض البيانات الديناميكية ليعمل بشكل صحيح. على سبيل المثال، يجب أن يعرف PreferenceController الذي يوقف الإشعارات لتطبيق معيّن التطبيق الذي سيتم اتخاذ إجراء بشأنه. بما أنّ PreferenceControllers يتم تحديدها دائمًا في ملف XML، لا يمكن تقديم وسيطات إضافية لإنشاء العنصر. بدلاً من ذلك، يتم توفير هذه القيم الإضافية من خلال أدوات الضبط العامة في PreferenceController ويتم ضبطها باستخدام الأسلوب use(...) من SettingsFragment.

// ExamplePreferenceController.java
public class ExamplePreferenceContorller extends PreferenceController<Preference> {

  private ExampleArg mExampleArg;

  public ExamplePreferenceController(...) {
    ...
  }

  public void setExampleArg(ExampleArg exampleArg) {
    mExampleArg = exampleArg;
  }
}

// ExampleSettingsFragment.java
public class ExampleSettingsFragment extends SettingsFragment {

  @Override
  @XmlRes
  protected int getPreferenceScreenResId() {
    Return R.xml.example_settings_fragment;
  }

  @Override
  public void onAttach(Context context) {
    ExampleArg arg = (ExampleArg) getArguments().getSerializeable(ARG_KEY);
    ExamplePreferenceController controller =
        use(ExamplePreferenceController.class, R.string.pk_example_preference_key);
    controller.setExampleArg(arg);
  }
}

كلما زادت وتيرة استخدام الطريقة use(...)، ازدادت صعوبة الحفاظ على الهدف الأصلي المتمثل في إمكانية إعادة ترتيب التسلسل الهرمي للإعدادات مع إجراء الحد الأدنى من التغييرات على رمز Java، لأنّه يجب نسخ أقسام كبيرة من رمز المقتطف الحالي إلى المقتطف الذي تم إنشاؤه حديثًا. إليك إحدى الطرق لتقليل صعوبة تنفيذ ذلك:

  • قلِّل من استخدام use(...).
  • حاوِل إبقاء كلّ استدعاء use(...) في مكان واحد في المقتطف (على سبيل المثال، في طريقة onAttach()).

معالجة النية

يتم تحديد جميع النوايا التي يجب أن يعالجها تطبيق "إعدادات السيارة" في ملف البيان. يتم تحديد النوايا بشكل عام ومعالجتها مثل معظم تطبيقات Android العادية، مع تحديد جميع الأنشطة وفلاتر النوايا في البيان.

تغيير المقتطف الجذر

يمكن عرض رمز الخروج أو إخفاؤه باستخدام config_show_settings_root_exit_icon إذا أردت ذلك.

تخصيص المظهر

تخصيص السمات والموارد الأخرى

يستخدم تطبيق "إعدادات السيارة" بشكل أساسي CarSettingTheme، وهو إضافة إلى Theme.CarUi. يُستخدَم هذا المظهر لتوحيد مظهر تطبيقات النظام وأسلوبها لضمان اتساق النظام.

تخصيص الإعدادات المفضّلة

تسري إعدادات التخصيص على المواقع الجغرافية الإضافية التالية:

  • يتم تحديد تنسيق بعض فئات الإعدادات المفضّلة الأساسية في car_preference وتداخلها لإصدارات السيارات. يمكن استبدال أيّ تنسيقات تخصيص لفئات الإعدادات المفضّلة الأساسية هنا.
  • تستخدِم "إعدادات السيارة" بعض الإعدادات المفضّلة المخصّصة المحدّدة في ملف برمجي أساسي هو common. يجب أن تكون هذه الإعدادات مضمّنة في وحدة "إعدادات السيارة" بشكل منفصل عن فئات الإعدادات المفضّلة الأساسية.