طرَح Android 8.0 بنية معلومات جديدة لتطبيق "الإعدادات" وتبسيط الطريقة التي يتم بها تنظيم الإعدادات وتسهيل على المستخدمين العثور سريعًا على الإعدادات لتخصيص أجهزتهم التي تعمل بنظام Android. قدّم الإصدار 9 من Android بعض التحسينات لتوفير المزيد من وظائف "الإعدادات" وتسهيل عملية التنفيذ.
الأمثلة والمصدر
يتم حاليًا تنفيذ معظم الصفحات في "الإعدادات" باستخدام الإطار الجديد. إليك مثال جيد:
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، اطّلِع علىملف readmepackages/apps/Settings/tests/robotests/README.md
.
بنية المعلومات بنمط المكون الإضافي
يتم تنفيذ كل عنصر من عناصر الإعدادات باعتباره أحد عناصر الإعدادات المفضّلة. يمكن نقل الإعدادات المفضّلة بسهولة من صفحة إلى أخرى.
لتسهيل عملية نقل إعدادات متعددة، قدّم نظام Android 8.0 جزء مضيف بنمط المكون الإضافي يحتوي على عناصر الإعدادات. عناصر الإعدادات هي كوحدات تحكم بنمط المكونات الإضافية. وبالتالي، يتم إنشاء صفحة الإعدادات من خلال قطعة مضيفة واحدة وعناصر تحكّم متعددة في الإعدادات.
DashboardFragment
DashboardFragment
هو مضيف وحدات التحكّم في الإعدادات المفضّلة بنمط المكوّن الإضافي.
يرث المقتطف من PreferenceFragment
ويحتوي على عناصر ربط ل
توسيع كلّ من قوائم الإعدادات المفضّلة الثابتة وقوائم الإعدادات المفضّلة الديناميكية وتعديلها.
الإعدادات المفضّلة الثابتة
يتم تحديد قائمة الإعدادات المفضّلة الثابتة في ملف XML باستخدام العلامة <Preference>
. يستخدم تنفيذ
DashboardFragment
طريقة
getPreferenceScreenResId()
لتحديد ملف XML الذي يحتوي على
القائمة الثابتة للإعدادات المفضّلة التي سيتم عرضها.
الخيارات المفضّلة الديناميكية
يمثّل العنصر الديناميكي مربّع شاشة يتضمّن هدفًا يؤدي إلى activity خارجي أو داخلي. وعادةً ما يؤدي الغرض إلى صفحة إعداد مختلفة. على سبيل المثال،
عنصر الإعداد "Google" في الصفحة الرئيسية لإعدادات 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(),
وما إلى ذلك. تتوفّر مستندات تفصيلية لكل واجهة برمجة تطبيقات في فئة الواجهة.
يتمثل أحد القيود المفروضة على تنفيذ BasePreferenceController
(و
فئاتها الفرعية، مثل TogglePreferenceController
) في أنّه يجب أن يتطابق توقيع
المنشئ مع أيّ من العناصر التالية:
public MyController(Context context, String key) {}
public MyController(Context context) {}
أثناء تثبيت تفضيل للجزء، توفر لوحة التحكم طريقة
إرفاق PreferenceController
قبل وقت العرض في وقت التثبيت، يتم ربط وحدة التحكّم بالجزء حتى يتم إرسال جميع الأحداث ذات الصلة في المستقبل إلى وحدة التحكّم.
DashboardFragment
بقائمة من
PreferenceController
في الشاشة. في العنصر المجزّأ
onCreate()
، يتمّ استدعاء جميع وحدات التحكّم لطريقة
getAvailabilityStatus()
، وإذا كانت تعرض قيمة صحيحة، يتمّ استدعاء
displayPreference()
لمعالجة منطق العرض.
getAvailabilityStatus()
من المهم أيضًا إخبار إطار عمل "الإعدادات"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
الذي يحتوي على الإعدادات التي ضبطتها. النقل والعثور على إدخال النشاط الذي يمثل هذا الإعداد. - اضبط قيمة البيانات الوصفية للنشاط لملف شخصي على Facebook
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() للصفحة.
- أضِف عنصر Preference جديدًا في ملف XML. تأكَّد من أنّه يحتوي على
android:key
فريد. -
حدِّد سمة
PreferenceController
لهذا الخيار المفضّل في طريقةgetPreferenceControllers()
للصفحة.- في الإصدار 8.x من Android والإصدار 9 اختياريًا،
أنشئ مثيلًا لـ
PreferenceController
لهذا الخيار المفضّل فيcreatePreferenceControllers()
الصفحة.إذا كان هذا التفضيل موجودًا بالفعل في أماكن أخرى، فمن المحتمل أن يكون هناك حصلتَ على
PreferenceController
من أجل ذلك. يمكنك إعادة استخدامPreferenceController
بدون إنشاء خريطة جديدة. -
بدءًا من Android 9، يمكنك اختيار إدراج العنصر
PreferenceController
في ملف XML بجانب الإعداد المفضّل. مثلاً:<Preference android:key="reset_dashboard" android:title="@string/reset_dashboard_title" settings:controller="com.android.settings.system.ResetPreferenceController"/>
- في الإصدار 8.x من Android والإصدار 9 اختياريًا،
أنشئ مثيلًا لـ
إنشاء إعداد مفضّل ديناميكي
- ابحث عن الفئة التي تستضيفها الصفحة الأصلية والصفحة المقصودة. يمكنك الاطّلاع على
هذه المعلومات في
DashboardFragmentRegistry
. - إنشاء نشاط جديد في "
AndroidManifest
" - أضِف البيانات الوصفية اللازمة إلى النشاط الجديد لتحديد الإعداد. اضبط قيمة ال metadata لـ
com.android.settings.category
على القيمة نفسها التي تم تحديدها في الخطوة 1.
إنشاء صفحة جديدة
- أنشئ جزءًا جديدًا يرث من
DashboardFragment
. - حدِّد فئتها في
DashboardFragmentRegistry
.ملاحظة: هذه الخطوة اختيارية. إذا لم تكن بحاجة أي تفضيلات ديناميكية في هذه الصفحة، فلن تحتاج إلى تقديم مفتاح فئة.
- اتّبِع الخطوات لإضافة الإعدادات المطلوبة لهذه الصفحة. لمزيد من المعلومات، المعلومات، يُرجى الاطّلاع على قسم التنفيذ.
التحقُّق
- يمكنك إجراء اختبارات الألعاب السلسة في "الإعدادات". يجب اجتياز جميع الاختبارات الحالية والجديدة.
- أنشئ تطبيق "الإعدادات" وثبِّته، ثم افتح يدويًا الصفحة التي يتم تعديلها. ومن المفترض أن يتم تعديل الصفحة على الفور.