אפליקציות רבות ל-Android TV מבוססות על רכיבי Android מקוריים, אבל חשוב גם לקחת בחשבון את הנגישות של צדדים שלישיים פריימים או רכיבים, במיוחד כשמשתמשים בתצוגות מותאמות אישית.
יכול להיות שרכיבי תצוגה מותאמת אישית שממשקים ישירות עם OpenGL או עם Canvas לא יפעלו כמו שצריך עם שירותי נגישות כמו Talkback ו'גישה באמצעות מתג'.
כדאי לשקול כמה מהבעיות הבאות שעשויות להתרחש לאחר החלפת TalkBack ב:
- מיקוד הנגישות (מלבן ירוק) עשוי להיעלם באפליקציה.
- יכול להיות שמיקוד הנגישות יבחר את התחום של כל המסך.
- ייתכן שלא ניתן להזיז את מיקוד הנגישות.
- יכול להיות שארבעת מקשי הכיוון בלחצני החיצים לא ישפיעו על, גם אם הקוד מטפל בהם.
אם הבחנתם באחת מהבעיות האלה באפליקציה, צריך לבדוק
האפליקציה חושפת את AccessibilityNodeInfo
שלה
עץ לשירותי הנגישות.
המשך המדריך הזה מספק כמה פתרונות ושיטות מומלצות לטיפול בבעיות האלה.
שירותי נגישות צורכים אירועים בלחצני החיצים (D-pad)
הסיבה לבעיה הזו היא שהאירועים המרכזיים נצרכים על ידי הנגישות. שירותים שונים.
כפי שמתואר באיור 1, כש-TalkBack מופעל, אירועי D-pad לא מועברות ל-handler של לחצני החיצים (D-pad) שהוגדר על ידי המפתח. במקום זאת, שירותי הנגישות מקבלים את האירועים המרכזיים, כך שהם יכולים להעביר המיקוד בנגישות. כי רכיבי Android בהתאמה אישית לא חושפים כברירת מחדל שירותי נגישות לגבי המיקום שלהם במסך, שירותי הנגישות לא יכולים להעביר את מיקוד הנגישות כדי להדגיש אותם.
שירותי נגישות אחרים מושפעים באופן דומה: גם אירועים בלחצני החיצים (D-pad) נצרכים כשמשתמשים ב'גישה באמצעות מתג'.
כי אירועי מקשי החיצים נשלחים לשירותי הנגישות, וגם
השירות לא יודע איפה נמצאים רכיבי ממשק המשתמש בתצוגה מותאמת אישית,
עליך להטמיע את 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 - Enable Blind and Low-Vision נגישות ב-Android או לקרוא מידע נוסף על אכלוס אירועי נגישות.
שיטות מומלצות
חובה:
AccessibilityNodeInfo.getBoundsInScreen()
חייבים להגדיר את מיקום הרכיב.חובה:
AccessibilityNodeInfo.setVisibleToUser()
חייבת לשקף את מידת החשיפה של הרכיב.חובה:
AccessibilityNodeInfo.getContentDescription()
חייבים לציין את תיאור התוכן ש-TalkBack יכריז.יש לציין
AccessibilityNodeInfo.setClassName()
כדי ששירותים יוכלו להבחין בין סוג הרכיב.כשמטמיעים את המאפיין
performAction()
, משקפות את הפעולה באמצעות התוAccessibilityEvent
המתאים.כדי להטמיע סוגי פעולות נוספים, כמו
ACTION_CLICK
, צריך להפעילAccessibilityNodeInfo.addAction(ACTION_CLICK)
באמצעות הלוגיקה המתאימה מ-performAction()
.במקרים הרלוונטיים, יש לשקף את מצב הרכיב עבור
setFocusable()
,setClickable()
,setScrollable()
, ושיטות דומות.עיון במסמכי התיעוד לגבי
AccessibilityNodeInfo
כדי לזהות דרכים אחרות שבהן שירותי נגישות יכולים לקיים אינטראקציה טובה יותר עם הרכיבים שלך.
דוגמה
כדאי לעיין בדוגמה לנגישות בתצוגה מותאמת אישית ל-Android TV כדי לראות שיטות מומלצות הוספת תמיכה בנגישות לאפליקציות באמצעות תצוגות בהתאמה אישית.