Изменение порядка фокусировки доступности
Можно ли изменить порядок фокусировки доступности? Например, если у меня есть 3 представления рядом друг с другом, с ids view1, view2 и view3, есть ли простой способ сделать фокус доступности доступным для просмотра3, когда пользователь переместится прямо из view1?
Вот что я пробовал:
У меня есть следующее в линейном макете.
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:id="@+id/imageView"
android:focusable="true"
android:nextFocusUp="@+id/imageView3"
android:nextFocusDown="@+id/imageView3"
android:nextFocusRight="@+id/imageView3"
android:nextFocusLeft="@+id/imageView3"
android:nextFocusForward="@+id/imageView3"
android:src="@drawable/ic_launcher"/>
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:id="@+id/imageView2"
android:focusable="true"
android:src="@drawable/ic_launcher"/>
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:id="@+id/imageView3"
android:focusable="true"
android:nextFocusUp="@+id/imageView2"
android:nextFocusDown="@+id/imageView2"
android:nextFocusRight="@+id/imageView2"
android:nextFocusLeft="@+id/imageView2"
android:nextFocusForward="@+id/imageView2"
android:src="@drawable/ic_launcher"/>
Затем я запускаю это и устанавливаю ориентацию доступности на первый imageView. Пользуясь правом переходить к следующему элементу, я ожидаю, что он перенесет фокус доступности в imageView3, но вместо этого он перейдет к imageView2.
Ответы
Ответ 1
Для приложений с minSdkVersion> = 22 вы можете установить порядок обхода для программ чтения с экрана напрямую в XML с помощью android: accessibilityTraversalAfter:
<ImageView
android:id="@+id/imageView"
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/ic_launcher" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="30dp"
android:accessibilityTraversalAfter="@id/imageView3"
android:layout_height="30dp"
android:src="@drawable/ic_launcher" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/ic_launcher" />
Для приложений, поддерживающих более низкие уровни API, порядок обхода может быть установлен программно с помощью ViewCompat:
ViewCompat.setAccessibilityDelegate(imageView2, object : AccessibilityDelegateCompat() {
override fun onInitializeAccessibilityNodeInfo(host: View?, info: AccessibilityNodeInfoCompat?) {
info?.setTraversalAfter(imageView3)
super.onInitializeAccessibilityNodeInfo(host, info)
}
})
Пожалуйста, имейте в виду, что пользователи программы чтения с экрана полагаются на последовательность навигации, поэтому изменение порядка фокусировки является антишаблоном и его следует избегать.
Ответ 2
Для приложений с minSdkVersion
> = 22 вы можете установить порядок обхода для программ чтения с экрана напрямую в XML с помощью android: accessibilityTraversalAfter:
<ImageView
android:id="@+id/imageView"
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/ic_launcher" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="30dp"
android:accessibilityTraversalAfter="@id/imageView3"
android:layout_height="30dp"
android:src="@drawable/ic_launcher" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/ic_launcher" />
Для приложений, поддерживающих более низкие уровни API, порядок обхода может быть установлен программно с помощью ViewCompat
:
ViewCompat.setAccessibilityDelegate(imageView2, object : AccessibilityDelegateCompat() {
override fun onInitializeAccessibilityNodeInfo(host: View?, info: AccessibilityNodeInfoCompat?) {
info?.setTraversalAfter(imageView3)
super.onInitializeAccessibilityNodeInfo(host, info)
}
})
Пожалуйста, имейте в виду, что пользователи программы чтения с экрана полагаются на последовательность навигации, поэтому изменение порядка фокусировки является антишаблоном и его следует избегать.