طرَح 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
- البحث عن ملفات XML المفضّلة للصفحة الأصلية والوجهة
. يمكنك العثور على هذه المعلومات من
طريقة
getPreferenceScreenResId()
. - أزِل الإعدادات المفضّلة من ملف XML الخاص بالصفحة الأصلية.
- أضِف الإعدادات المفضّلة إلى ملف XML الخاص بالصفحة المقصودة.
- أزِل
PreferenceController
لهذا الخيار المفضّل من تنفيذ Java للصفحة الأصلية. يكون عادةً فيcreatePreferenceControllers()
قد يتم الإعلان عن وحدة التحكم في تنسيق XML مباشرةً.ملاحظة: قد لا يحتوي التفضيل
PreferenceController
- إنشاء مثيل
PreferenceController
في الصفحة المقصودةcreatePreferenceControllers()
إذا كانت إنّPreferenceController
معرَّف في XML في الصفحة القديمة، يُرجى تحديده بتنسيق XML للصفحة الجديدة أيضًا.
النقل الديناميكي في Android 9
- ابحث عن الفئة التي تستضيفها الصفحة الأصلية والصفحة المقصودة. يمكنك
هذه المعلومات في
DashboardFragmentRegistry
. - افتح ملف
AndroidManifest.xml
الذي يحتوي على الإعدادات التي ضبطتها. النقل والعثور على إدخال النشاط الذي يمثل هذا الإعداد. - ضبط قيمة البيانات الوصفية للنشاط
com.android.settings.category
إلى مفتاح فئة الصفحة الجديدة.
حركة ثابتة في إصدارات Android 8.x
- ابحث عن ملفات XML لتفضيلات الصفحة الأصلية والصفحة المقصودة. يمكنك العثور على هذه المعلومات من طريقة
- أزِل التفضيل في ملف XML الخاص بالصفحة الأصلية.
- أضِف الإعدادات المفضّلة إلى ملف XML الخاص بالصفحة المقصودة.
- أزِل
PreferenceController
لهذا الخيار المفضّل في تنفيذ Java للصفحة الأصلية. يكون عادةً فيgetPreferenceControllers()
- إنشاء مثيل
PreferenceController
في الصفحة المقصودةgetPreferenceControllers()
getPreferenceScreenResId()
الخاصة بالصفحة.
ملاحظة: من المحتمل ألا يكون للتفضيل
PreferenceController
النقل الديناميكي في إصدارات Android 8.x
- ابحث عن الفئة التي تستضيفها الصفحة الأصلية والصفحة المقصودة. يمكنك الاطّلاع على
هذه المعلومات في
DashboardFragmentRegistry
. - افتح ملف
AndroidManifest.xml
الذي يحتوي على الإعدادات التي ضبطتها. النقل والعثور على إدخال النشاط الذي يمثل هذا الإعداد. - تغيير قيمة البيانات الوصفية للنشاط
com.android.settings.category
تعيين نقطة القيمة على مفتاح فئة الصفحة الجديدة.
إنشاء إعداد مفضّل جديد في إحدى الصفحات
إذا كان التفضيل مُدرجًا بشكل ثابت في تفضيل الصفحة الأصلية بتنسيق XML اتّبع الإجراء الثابت أدناه. وبخلاف ذلك، عليك اتّباع ديناميكي.
إنشاء تفضيل ثابت
- ابحث عن ملفات XML المفضّلة للصفحة. يمكنك العثور على هذه المعلومات من طريقة getPreferencescreenResId() للصفحة.
- أضِف عنصر الإعدادات المفضّلة الجديد في ملف XML. تأكَّد من أنّها تحتوي على سمة
android:key
فريدة. -
يجب تحديد
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"/>
- في الإصدار 8.x من نظام التشغيل Android، وكذلك اختياريًا في الإصدار 9 من نظام التشغيل Android،
إنشاء مثيل
إنشاء إعداد مفضّل ديناميكي
- ابحث عن الفئة التي تستضيفها الصفحة الأصلية والصفحة المقصودة. يمكنك الاطّلاع على
هذه المعلومات في
DashboardFragmentRegistry
. - إنشاء نشاط جديد في "
AndroidManifest
" - أضِف البيانات الوصفية اللازمة إلى النشاط الجديد لتحديد الإعداد. ضبط
قيمة البيانات الوصفية لـ
com.android.settings.category
مع القيمة نفسها المحدد في الخطوة 1.
إنشاء صفحة جديدة
- إنشاء جزء جديد مكتسب من
DashboardFragment
- حدِّد فئته في
DashboardFragmentRegistry
.ملاحظة: هذه الخطوة اختيارية. إذا لم تكن بحاجة أي تفضيلات ديناميكية في هذه الصفحة، فلن تحتاج إلى تقديم مفتاح فئة.
- اتّبِع الخطوات لإضافة الإعدادات المطلوبة لهذه الصفحة. لمزيد من المعلومات، المعلومات، يُرجى الاطّلاع على قسم التنفيذ.
التحقُّق
- يمكنك إجراء اختبارات الألعاب السلسة في "الإعدادات". يجب أن تكون جميع الاختبارات الحالية والجديدة البطاقة.
- أنشِئ الإعدادات وثبِّتها، ثم افتح الصفحة التي يتم تعديلها يدويًا. ومن المفترض أن يتم تعديل الصفحة على الفور.