Изменение порядка фокусировки доступности

Можно ли изменить порядок фокусировки доступности? Например, если у меня есть 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)
        }
    })

Пожалуйста, имейте в виду, что пользователи программы чтения с экрана полагаются на последовательность навигации, поэтому изменение порядка фокусировки является антишаблоном и его следует избегать.