22

是否可以更改可访问性焦点顺序?例如,如果我并排有 3 个视图,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,但它会转到 imageView2。

4

2 回答 2

37

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

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

于 2015-06-02T08:49:51.860 回答
-1

默认情况下,焦点顺序将落在最近的、相邻的、可聚焦的元素上。有时这可能与预期不匹配,因此可能需要提供明确的覆盖。

这可以通过使用以下方法来完成:

android:nextFocusDown 定义用户向下导航时接收焦点的下一个视图 android:nextFocusLeft 定义用户向左导航时接收焦点的下一个视图 android:nextFocusRight 定义用户向右导航时接收焦点的下一个视图 android:nextFocusUp定义用户向上导航时接收焦点的下一个视图。

来源:https ://www.bbc.co.uk/accessibility/forproducts/guides/mobile/focus-order/

于 2021-04-19T03:41:10.753 回答