是否可以更改辅助功能焦点顺序?例如,如果我有3个视图并排,使用ids 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。
答案 0 :(得分:17)
对于minSdkVersion&gt; = 22的应用程序,您可以使用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)
}
})
请记住,屏幕阅读器用户依赖于导航的一致性,因此,更改焦点顺序是一种反模式,应该避免使用。
答案 1 :(得分:-1)
默认情况下,焦点顺序将落到最近的、相邻的、可聚焦的元素上。有时这可能与预期不符,因此可能需要提供显式覆盖。
这可以通过使用以下方法来完成:
android:nextFocusDown 定义了当用户向下导航时接收焦点的下一个视图 android:nextFocusLeft 定义了当用户向左导航时接收焦点的下一个视图, android:nextFocusRight 定义了当用户向右导航时接收焦点的下一个视图, android:nextFocusUp 定义了当用户向上导航时接收焦点的下一个视图。
来源:https://www.bbc.co.uk/accessibility/forproducts/guides/mobile/focus-order/