هندسة المعلومات

طرَح Android 8.0 بنية معلومات جديدة لتطبيق "الإعدادات" وتبسيط الطريقة التي يتم بها تنظيم الإعدادات وتسهيل على المستخدمين العثور سريعًا على الإعدادات لتخصيص أجهزتهم التي تعمل بنظام Android. أدخل Android 9 بعض التحسينات لتوفير المزيد من وظائف الإعدادات وتسهيل التنفيذ

الأمثلة والمصدر

يتم حاليًا تنفيذ معظم الصفحات في "الإعدادات" باستخدام إطار العمل الجديد. جيدة هو DisplaySettings: packages/apps/Settings/src/com/android/settings/DisplaySettings.java

في ما يلي مسارات الملفات للمكوّنات المهمة:

  • CategoryKey: packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
  • DashboardFragmentRegistry: packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
  • DashboardFragment: packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragment.java
  • AbstractPreferenceController: frameworks/base/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
  • BasePreferenceController (تم طرحه في Android 9): packages/apps/Settings/src/com/android/settings/core/BasePreferenceController.java

التنفيذ

ننصح الشركات المصنّعة للأجهزة بتعديل معلومات "الإعدادات" الحالية. البنية وإدراج صفحات إعدادات إضافية حسب الحاجة لاستيعاب الميزات الخاصة بالشركاء. نقل التفضيلات من الصفحة القديمة (يتم التنفيذ SettingsPreferencePage) إلى صفحة جديدة (تم تنفيذها باستخدام DashboardFragment) يمكن أن تكون معقدة. التفضيل من من المحتمل ألا يتم تنفيذ صفحة قديمة باستخدام PreferenceController.

لذا، عند نقل التفضيلات من صفحة قديمة إلى صفحة جديدة، تحتاج إلى إنشاء PreferenceController ونقل الرمز إلى وحدة التحكّم قبل إنشاء مثيل له في DashboardFragment الجديد. واجهات برمجة التطبيقات التي يتم توضيح طلب "PreferenceController" في اسمه موثقة في Javadoc.

يُنصح بشدة بإضافة اختبار وحدة لكل PreferenceController. إذا تم إرسال التغيير إلى AOSP، يجب اختبار الوحدة. للحصول على مزيد من المعلومات حول كيفية كتابة الاختبارات المستندة إلى Robolectric، راجع الملف التمهيدي packages/apps/Settings/tests/robotests/README.md.

بنية المعلومات بنمط المكون الإضافي

يتم تنفيذ كل عنصر من عناصر الإعدادات باعتباره أحد عناصر الإعدادات المفضّلة. يمكن بسهولة تحديد تم نقلهما من صفحة إلى أخرى.

لتسهيل عملية نقل إعدادات متعددة، قدّم نظام Android 8.0 جزء مضيف بنمط المكون الإضافي يحتوي على عناصر الإعدادات. عناصر الإعدادات هي كوحدات تحكم بنمط المكونات الإضافية. وبالتالي، يتم إنشاء صفحة الإعدادات بواسطة جزء مضيف واحد ووحدات تحكم إعدادات متعددة.

قسم لوحة المعلومات

DashboardFragment هو مضيف وحدات التحكّم في الإعدادات المفضّلة بنمط المكوّن الإضافي. يتم اكتساب الجزء من PreferenceFragment ويحتوي على عناصر الجذب إلى. توسيع وتحديث كل من قوائم الإعدادات المفضّلة الثابتة وقوائم الإعدادات المفضّلة الديناميكية

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

يتم تحديد قائمة الإعدادات المفضّلة الثابتة في ملف XML باستخدام العلامة <Preference>. حاسمة يستخدم تنفيذ DashboardFragment getPreferenceScreenResId() لتحديد ملف XML الذي يحتوي على قائمة ثابتة من التفضيلات المراد عرضها.

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

يمثّل العنصر الديناميكي مربّعًا غرضه التوجيه إلى قسم خارجي أو داخلي. النشاط. وعادةً ما يؤدي الغرض إلى صفحة إعداد مختلفة. على سبيل المثال: و"Google" عنصر الإعداد في الصفحة الرئيسية للإعدادات عنصرًا ديناميكيًا. ديناميكية يتم تحديد العناصر في AndroidManifest (تم مناقشتها أدناه) وتحميلها من خلال FeatureProvider (معرَّفة على أنّها DashboardFeatureProvider).

الإعدادات الديناميكية أكثر أهمية من الإعدادات الثابتة. لذلك، على المطوّرين عادةً تنفيذ الإعدادات كإعداد ثابت. ومع ذلك، يمكن أن يكون الإعداد الديناميكي مفيدًا في الحالات التالية:

  • لا يتم تنفيذ هذا الإعداد مباشرةً في تطبيق "الإعدادات" (مثل إدخال إعدادات تم تنفيذها من قِبل المصنّع الأصلي للجهاز/تطبيقات مشغِّل شبكة الجوّال).
  • من المفترض أن يظهر الإعداد في الصفحة الرئيسية "الإعدادات".
  • لديك نشاط لهذا الإعداد من قبل ولا تريد تنفيذ تكوين ثابت إضافي.

لضبط نشاط كإعداد ديناميكي، عليك إجراء ما يلي:

  • ضَع علامة على النشاط كإعداد ديناميكي من خلال إضافة فلتر أهداف إلى الأخرى.
  • أخبر تطبيق "الإعدادات" بالفئة التي ينتمي إليها. الفئة ثابتة، محددة في CategoryKey.
  • اختياري: أضِف نص ملخّص عند عرض الإعداد.

إليك مثال مأخوذ من تطبيق "الإعدادات" في DisplaySettings.

<activity android:name="Settings$DisplaySettingsActivity"
                   android:label="@string/display_settings"
                   android:icon="@drawable/ic_settings_display">
             <!-- Mark the activity as a dynamic setting -->
              <intent-filter>
                     <action android:name="com.android.settings.action.IA_SETTINGS" />
              </intent-filter>
             <!-- Tell Settings app which category it belongs to -->
              <meta-data android:name="com.android.settings.category"
                     android:value="com.android.settings.category.ia.homepage" />
             <!-- Add a summary text when the setting is displayed -->
              <meta-data android:name="com.android.settings.summary"
                     android:resource="@string/display_dashboard_summary"/>
             </activity>

وفي وقت العرض، سيطلب الجزء قائمة بالتفضيلات من كلٍ من تم تحديد XML والإعدادات الديناميكية في AndroidManifest. سواء كانت ويتم تحديد PreferenceController في رمز Java أو بتنسيق XML، يدير DashboardFragment منطق المعالجة لكل إعداد. من خلال PreferenceController (المناقشة أدناه). ثم تتم المعروضة في واجهة المستخدم على شكل قائمة مختلطة.

وحدة التحكّم المفضَّلة

هناك اختلافات بين تنفيذ PreferenceController. في Android 9 وAndroid 8.x، كما هو موضح في هذا .

وحدة التحكّم المفضَّلة في إصدار Android 9

يحتوي PreferenceController على كل الأسباب المنطقية للتفاعل مع التفضيلات، بما في ذلك العرض والتحديث وفهرسة البحث وما إلى ذلك

يتم تعريف واجهة PreferenceController على أنّها BasePreferenceController على سبيل المثال، راجع التعليمة البرمجية في packages/apps/Settings/src/com/android/settings/core/ BasePreferenceController.java

هناك عدة فئات فرعية من BasePreferenceController، كل منها التعيين إلى نمط واجهة مستخدم محدد يتوافق مع تطبيق "الإعدادات" بشكل افتراضي. بالنسبة مثال، تتضمن TogglePreferenceController واجهة برمجة تطبيقات تربط مباشرةً لكيفية تفاعل المستخدم مع واجهة مستخدم التفضيل المستندة إلى التبديل.

تضم BasePreferenceController واجهات برمجة تطبيقات مثل getAvailabilityStatus()، displayPreference()، handlePreferenceTreeClicked(), وما إلى ذلك. وثائق تفصيلية لكل واجهة برمجة التطبيقات (API) موجودة في فئة الواجهة.

تقييد على تنفيذ BasePreferenceController (و فئاتها الفرعية مثل TogglePreferenceController) هو أنه يجب أن يتطابق توقيع الدالة الإنشائية مع أي مما يلي:

  • public MyController(Context context, String key) {}
  • public MyController(Context context) {}

أثناء تثبيت تفضيل للجزء، توفر لوحة التحكم طريقة إرفاق PreferenceController قبل وقت العرض في وقت التثبيت يتم توصيل وحدة التحكم بالجزء بحيث تكون جميع الأحداث المستقبلية ذات الصلة يتم إرساله إلى وحدة التحكم.

يحتفظ DashboardFragment بقائمة من PreferenceController في الشاشة. على الجزء onCreate()، تم استدعاء جميع وحدات التحكّم لتنفيذ getAvailabilityStatus()، وإذا كانت ناتجها true، تم استدعاء displayPreference() لمعالجة منطق العرض. إنّ تطبيق "getAvailabilityStatus()" مهم أيضًا لضبط "الإعدادات". العناصر المتاحة أثناء البحث.

PreferenceController في إصدارات Android 8.x

يحتوي PreferenceController على كل الأسباب المنطقية للتفاعل مع التفضيلات، بما في ذلك العرض وتحديثها وفهرسة البحث. وما إلى ذلك

ووفقًا لتفاعلات الإعدادات المفضّلة، تحتوي واجهة PreferenceController على واجهات برمجة التطبيقات isAvailable() و displayPreference() وhandlePreferenceTreeClicked() وما إلى ذلك. يمكن العثور على مستندات تفصيلية حول كل واجهة برمجة تطبيقات في فئة الواجهة.

أثناء تثبيت تفضيل للجزء، توفر لوحة التحكم طريقة إرفاق PreferenceController قبل وقت العرض في وقت التثبيت يتم توصيل وحدة التحكم بالجزء بحيث تكون جميع الأحداث المستقبلية ذات الصلة يتم إرساله إلى وحدة التحكم.

يحتفظ "DashboardFragment" بقائمة بـ "PreferenceControllers " في الشاشة. في onCreate() للجزء، جميع يتم استدعاء وحدات التحكم لإجراء isAvailable()، وإذا كانت يعرض القيمة "صحيح"، تم استدعاء displayPreference() لمعالجة العرض. المنطق.

استخدام DashboardFragment

نقل تفضيل من الصفحة "أ" إلى "ب"

إذا كان التفضيل مُدرجًا بشكل ثابت في تفضيل الصفحة الأصلية بتنسيق XML اتّبع إجراء النقل الثابت على جهاز Android الإصدار أدناه. وبخلاف ذلك، يمكنك اتّباع إجراء النقل الديناميكي. لإصدار Android الذي تستخدمه

الحركة الثابتة في Android 9

  1. البحث عن ملفات XML المفضّلة للصفحة الأصلية والوجهة . يمكنك العثور على هذه المعلومات من طريقة getPreferenceScreenResId().
  2. أزِل الإعدادات المفضّلة من ملف XML الخاص بالصفحة الأصلية.
  3. أضِف الإعدادات المفضّلة إلى ملف XML الخاص بالصفحة المقصودة.
  4. أزِل PreferenceController لهذا الخيار المفضّل من تنفيذ Java للصفحة الأصلية. يكون عادةً في createPreferenceControllers() قد يتم الإعلان عن وحدة التحكم في تنسيق XML مباشرةً.

    ملاحظة: قد لا يحتوي التفضيل PreferenceController

  5. إنشاء مثيل PreferenceController في الصفحة المقصودة createPreferenceControllers() إذا كانت إنّ PreferenceController معرَّف في XML في الصفحة القديمة، يُرجى تحديده بتنسيق XML للصفحة الجديدة أيضًا.

النقل الديناميكي في Android 9

  1. ابحث عن الفئة التي تستضيفها الصفحة الأصلية والصفحة المقصودة. يمكنك هذه المعلومات في DashboardFragmentRegistry.
  2. افتح ملف AndroidManifest.xml الذي يحتوي على الإعدادات التي ضبطتها. النقل والعثور على إدخال النشاط الذي يمثل هذا الإعداد.
  3. ضبط قيمة البيانات الوصفية للنشاط com.android.settings.category إلى مفتاح فئة الصفحة الجديدة.

حركة ثابتة في إصدارات Android 8.x

  1. ابحث عن ملفات XML لتفضيلات الصفحة الأصلية والصفحة المقصودة.
  2. يمكنك العثور على هذه المعلومات من طريقة getPreferenceScreenResId() الخاصة بالصفحة.
  3. أزِل التفضيل في ملف XML الخاص بالصفحة الأصلية.
  4. أضِف الإعدادات المفضّلة إلى ملف XML الخاص بالصفحة المقصودة.
  5. أزِل PreferenceController لهذا الخيار المفضّل في تنفيذ Java للصفحة الأصلية. يكون عادةً في getPreferenceControllers()
  6. ملاحظة: من المحتمل ألا يكون للتفضيل PreferenceController

  7. إنشاء مثيل PreferenceController في الصفحة المقصودة getPreferenceControllers()

النقل الديناميكي في إصدارات Android 8.x

  1. ابحث عن الفئة التي تستضيفها الصفحة الأصلية والصفحة المقصودة. يمكنك الاطّلاع على هذه المعلومات في DashboardFragmentRegistry.
  2. افتح ملف AndroidManifest.xml الذي يحتوي على الإعدادات التي ضبطتها. النقل والعثور على إدخال النشاط الذي يمثل هذا الإعداد.
  3. تغيير قيمة البيانات الوصفية للنشاط com.android.settings.category تعيين نقطة القيمة على مفتاح فئة الصفحة الجديدة.

إنشاء إعداد مفضّل جديد في إحدى الصفحات

إذا كان التفضيل مُدرجًا بشكل ثابت في تفضيل الصفحة الأصلية بتنسيق XML اتّبع الإجراء الثابت أدناه. وبخلاف ذلك، عليك اتّباع ديناميكي.

إنشاء تفضيل ثابت

  1. ابحث عن ملفات XML المفضّلة للصفحة. يمكنك العثور على هذه المعلومات من طريقة getPreferencescreenResId() للصفحة.
  2. أضِف عنصر الإعدادات المفضّلة الجديد في ملف XML. تأكَّد من أنّها تحتوي على سمة android:key فريدة.
  3. يجب تحديد PreferenceController لهذا الخيار المفضّل في الصفحة. طريقة getPreferenceControllers().
    • في الإصدار 8.x من نظام التشغيل Android، وكذلك اختياريًا في الإصدار 9 من نظام التشغيل Android، إنشاء مثيل PreferenceController لهذا التفضيل في طريقة createPreferenceControllers() للصفحة.

      إذا كان هذا التفضيل موجودًا بالفعل في أماكن أخرى، فمن المحتمل أن يكون هناك حصلتَ على PreferenceController من أجل ذلك. يمكنك إعادة استخدام PreferenceController بدون إنشاء خريطة جديدة.

    • بدءًا من الإصدار 9 من نظام Android، يمكنك اختيار الإفصاح عن PreferenceController في XML بجانب التفضيل. مثل:
      <Preference
              android:key="reset_dashboard"
              android:title="@string/reset_dashboard_title"
              settings:controller="com.android.settings.system.ResetPreferenceController"/>
      

إنشاء إعداد مفضّل ديناميكي

  1. ابحث عن الفئة التي تستضيفها الصفحة الأصلية والصفحة المقصودة. يمكنك الاطّلاع على هذه المعلومات في DashboardFragmentRegistry.
  2. إنشاء نشاط جديد في "AndroidManifest"
  3. أضِف البيانات الوصفية اللازمة إلى النشاط الجديد لتحديد الإعداد. ضبط قيمة البيانات الوصفية لـ com.android.settings.category مع القيمة نفسها المحدد في الخطوة 1.

إنشاء صفحة جديدة

  1. إنشاء جزء جديد مكتسب من DashboardFragment
  2. حدِّد فئته في DashboardFragmentRegistry.

    ملاحظة: هذه الخطوة اختيارية. إذا لم تكن بحاجة أي تفضيلات ديناميكية في هذه الصفحة، فلن تحتاج إلى تقديم مفتاح فئة.

  3. اتّبِع الخطوات لإضافة الإعدادات المطلوبة لهذه الصفحة. لمزيد من المعلومات، المعلومات، يُرجى الاطّلاع على قسم التنفيذ.

التحقُّق

  • يمكنك إجراء اختبارات الألعاب السلسة في "الإعدادات". يجب أن تكون جميع الاختبارات الحالية والجديدة البطاقة.
  • أنشِئ الإعدادات وثبِّتها، ثم افتح الصفحة التي يتم تعديلها يدويًا. ومن المفترض أن يتم تعديل الصفحة على الفور.