على الرغم من أنّ العديد من تطبيقات Android TV يتم إنشاؤها باستخدام مكوّنات Android الأصلية، من المهم أيضًا مراعاة إمكانية الوصول إلى الأُطر أو المكوّنات التابعة لجهات خارجية، خاصةً عند استخدام طرق عرض مخصّصة.
قد لا تعمل مكوّنات العرض المخصّصة التي تتفاعل مباشرةً مع OpenGL أو Canvas بشكل جيد مع خدمات تسهيل الاستخدام، مثل Talkback و"الوصول عبر مفتاح تحكّم".
ضَع في اعتبارك بعض المشاكل التالية التي قد تحدث عند تفعيل Talkback:
- قد يختفي تركيز تسهيل الاستخدام (مستطيل أخضر) في تطبيقك.
- قد يختار تركيز تسهيل الاستخدام حدود الشاشة بأكملها.
- قد لا يكون تركيز تسهيل الاستخدام قابلاً للنقل.
- قد لا يكون لمفاتيح الاتجاهات الأربعة على لوحة التحكّم أي تأثير، حتى إذا كان الرمز البرمجي يعالجها.
إذا لاحظت أيًا من هذه المشاكل في تطبيقك، تأكَّد من أنّ تطبيقك يعرض شجرة
AccessibilityNodeInfo لخدمات تسهيل الاستخدام.
يقدّم الجزء المتبقي من هذا الدليل بعض الحلول وأفضل الممارسات لمعالجة هذه المشاكل.
تستهلك خدمات تسهيل الاستخدام أحداث لوحة التحكّم
السبب الجذري لهذه المشكلة هو أنّ خدمات تسهيل الاستخدام تستهلك الأحداث الرئيسية.
كما هو موضّح في الرسم 1، عند تفعيل Talkback، لا يتم تمرير أحداث لوحة التحكّم إلى معالج لوحة التحكّم الذي يحدّده المطوّر. بدلاً من ذلك، تتلقّى خدمات تسهيل الاستخدام الأحداث الرئيسية حتى تتمكّن من نقل تركيز تسهيل الاستخدام. بما أنّ مكوّنات Android المخصّصة لا تعرض تلقائيًا معلومات لخدمات تسهيل الاستخدام حول موضعها على الشاشة، لا يمكن لخدمات تسهيل الاستخدام نقل تركيز تسهيل الاستخدام لتسليط الضوء عليها.
تتأثر خدمات تسهيل الاستخدام الأخرى بشكل مماثل: قد يتم أيضًا استهلاك أحداث لوحة التحكّم عند استخدام "الوصول عبر مفتاح تحكّم".
بما أنّ أحداث لوحة التحكّم يتم إرسالها إلى خدمات تسهيل الاستخدام، ولا تعرف هذه الخدمة مكان مكوّنات واجهة المستخدم في طريقة عرض مخصّصة، عليك تنفيذ AccessibilityNodeInfo لتطبيقك من أجل إعادة توجيه الأحداث الرئيسية بشكل صحيح.
عرض المعلومات لخدمات تسهيل الاستخدام
لتزويد خدمات تسهيل الاستخدام بمعلومات كافية حول الموضع
والوصف لطرق العرض المخصّصة، نفِّذ AccessibilityNodeInfo لعرض تفاصيل كل مكوّن. لتحديد العلاقة المنطقية بين طرق العرض
حتى تتمكّن خدمات تسهيل الاستخدام من إدارة التركيز، نفِّذ
ExploreByTouchHelper واضبطه باستخدام
ViewCompat.setAccessibilityDelegate(View, AccessibilityDelegateCompat)
لطرق العرض المخصّصة.
عند تنفيذ ExploreByTouchHelper، عليك إلغاء الطرق الأربع المجردة:
Kotlin
// Return the virtual view ID whose view is covered by the input point (x, y).
protected fun getVirtualViewAt(x: Float, y: Float): Int
// Fill the virtual view ID list into the input parameter virtualViewIds.
protected fun getVisibleVirtualViews(virtualViewIds: List<Int>)
// For the view whose virtualViewId is the input virtualViewId, populate the
// accessibility node information into the AccessibilityNodeInfoCompat parameter.
protected fun onPopulateNodeForVirtualView(virtualViewId: Int, @NonNull node: AccessibilityNodeInfoCompat)
// Set the accessibility handling when perform action.
protected fun onPerformActionForVirtualView(virtualViewId: Int, action: Int, @Nullable arguments: Bundle): Boolean
Java
// Return the virtual view ID whose view is covered by the input point (x, y).
protected int getVirtualViewAt(float x, float y)
// Fill the virtual view ID list into the input parameter virtualViewIds.
protected void getVisibleVirtualViews(List<Integer> virtualViewIds)
// For the view whose virtualViewId is the input virtualViewId, populate the
// accessibility node information into the AccessibilityNodeInfoCompat parameter.
protected void onPopulateNodeForVirtualView(int virtualViewId, @NonNull AccessibilityNodeInfoCompat node)
// Set the accessibility handling when perform action.
protected boolean onPerformActionForVirtualView(int virtualViewId, int action, @Nullable Bundle arguments)
لمزيد من التفاصيل، شاهِد Google I/O 2013 - Enabling Blind and Low-Vision Accessibility on Android أو اطّلِع على مزيد من المعلومات حول populating accessibility events.
أفضل الممارسات
مطلوبة:
AccessibilityNodeInfo.getBoundsInScreen()يجب أن تحدّد موضع المكوّن.مطلوبة:
AccessibilityNodeInfo.setVisibleToUser()يجب أن تعكس مدى ظهور المكوّن.مطلوبة:
AccessibilityNodeInfo.getContentDescription()يجب أن تحدّد وصف المحتوى الذي سيعلنه Talkback.حدِّد
AccessibilityNodeInfo.setClassName()حتى تتمكّن الخدمات من تمييز نوع المكوّن.عند تنفيذ
performAction()، عليك عرض الإجراء باستخدام مطابقAccessibilityEvent.لتنفيذ المزيد من أنواع الإجراءات، مثل
ACTION_CLICK، استخدِمAccessibilityNodeInfo.addAction(ACTION_CLICK)باستخدام المنطق المقابل فيperformAction().عند الاقتضاء، عليك عرض حالة المكوّن لـ
setFocusable()،setClickable()،setScrollable()والطرق المشابهة.راجِع وثائق
AccessibilityNodeInfoلتحديد الطرق الأخرى التي يمكن من خلالها لخدمات تسهيل الاستخدام التفاعل بشكل أفضل مع مكوّناتك.
عيّنة
راجِع عيّنة تسهيل استخدام طريقة العرض المخصّصة لتطبيق Android TV للاطّلاع على أفضل الممارسات لإضافة دعم تسهيل الاستخدام إلى التطبيقات التي تستخدم طرق عرض مخصّصة.