我的应用中有一些屏幕,其中TalkBack无法推断正确的阅读顺序。根据文档,我可以使用android:accessibilityTraversalAfter
和朋友更改阅读顺序。但是,对于应该一起阅读的可聚焦android:accessibilityTraversalAfter
中的元素,它对我来说不起作用。
整个布局看起来像这样:
ViewGroup
它在屏幕中间显示<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:accessibilityTraversalBefore="@id/before"
android:focusable="true"
tools:context=".MainActivity">
<TextView
android:id="@+id/before"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:accessibilityTraversalAfter="@id/before"
android:text="Before"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
<TextView
android:id="@+id/after"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:accessibilityTraversalBefore="@id/after"
android:text="After"
app:layout_constraintBottom_toTopOf="@+id/before"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
,在底部显示After
。我希望TalkBack将整个屏幕视为一个连续的元素,因此我将Before
设置为android:focusable
。默认情况下,“话语提示”显示为:“之后,之前”。但我希望它阅读“” Before,after“。尽管我添加了true
和android:accessibilityTraversalBefore
,但它仍显示为“ After,before”。那是节点树调试的输出:
android:accessibilityTraversalAfter
我在做什么错?
仅出于完整性考虑:09-25 16:07:57.990 21842 21842 V TreeDebug: (-2147455381)429.FrameLayout:(0, 0 - 1080, 1920):A
09-25 16:07:57.991 21842 21842 V TreeDebug: (30189)429.TextView:(42, 101 - 397, 172):TEXT{My Application}:A:supportsTextLocation
09-25 16:07:57.991 21842 21842 V TreeDebug: (31150)429.ViewGroup:(0, 210 - 1080, 1794):Fa:focusable:accessibilityFocused
09-25 16:07:57.991 21842 21842 V TreeDebug: (33072)429.TextView:(499, 951 - 581, 1002):TEXT{After}:A:supportsTextLocation
09-25 16:07:57.991 21842 21842 V TreeDebug: (32111)429.TextView:(485, 1743 - 595, 1794):TEXT{Before}:A:supportsTextLocation
为26,minSdkVersion
为29。
我已经研究了问题,发现以下内容:契约中的targetSdkVersion
和accessibilityTraversalBefore
标志生效,但仅针对其预期用途-它们适用于Accessibility Service应用程序(例如,对讲功能)。换句话说,如果从根目录布局中删除accessibilityTraversalAfter
属性,则会看到导航是正确的。
但是这些标志不会影响如何为根focusable
构造AccessibilityNode
。从ViewGroup
中可以看到,实际的文本构造逻辑确实[[not考虑了子代如何使用上面提到的标志构造其导航。
sources of ViewGroup#onInitializeAccessibilityNodeInfoInternal()
在主机活动/片段内部:
ViewGroup#onInitializeAccessibilityNodeInfoInternal()
这将产生所需的结果:对讲将发音“ Before,After”。
[不幸的是,这是一个容易出错的代码,这意味着,如果以某种方式重组视图层次结构,则子级顺序将被交换,那么此节点文本构造逻辑将被破坏。但是,我无法提出更好的解决方案,也看不到有可能指示父母考虑孩子的订购标志(基于消息来源)。