修改辅助功能焦点顺序



是否可以更改可访问性焦点顺序?例如,如果我有三个并排的视图,ID分别为view1、view2和view3,当用户从view1向右滑动时,有没有一种简单的方法可以使可访问性焦点转到view3?

以下是我尝试过的:

我有以下线性布局。

<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,但它会移动到imageView 2。

对于minSdkVersion>=22的应用程序,您可以使用android:accessibilityTraversalAfter:直接在XML中设置屏幕阅读器的遍历顺序

<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)
    }
})

请记住,屏幕阅读器用户依赖于导航的一致性,因此,更改焦点顺序是一种反模式,应该避免。

最新更新