TalkBack:无法更改可聚焦ViewGroup中元素的阅读顺序

问题描述 投票:0回答:1

我的应用中有一些屏幕,其中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“。尽管我添加了trueandroid: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。

android talkback android-accessibility
1个回答
0
投票

我已经研究了问题,发现以下内容:契约中的targetSdkVersionaccessibilityTraversalBefore标志生效,但仅针对其预期用途-它们适用于Accessibility Service应用程序(例如,对讲功能)。换句话说,如果从根目录布局中删除accessibilityTraversalAfter属性,则会看到导航是正确的。

但是这些标志不会影响如何为根focusable构造AccessibilityNode。从ViewGroup中可以看到,实际的文本构造逻辑确实[[not考虑了子代如何使用上面提到的标志构造其导航。

为了解决问题,我已经从布局xml中删除了过多的标志,例如:

sources of ViewGroup#onInitializeAccessibilityNodeInfoInternal()

在主机活动/片段内部:

ViewGroup#onInitializeAccessibilityNodeInfoInternal()

这将产生所需的结果:对讲将发音

“ Before,After”。

[不幸的是,这是一个容易出错的代码,这意味着,如果以某种方式重组视图层次结构,则子级顺序将被交换,那么此节点文本构造逻辑将被破坏。但是,我无法提出更好的解决方案,也看不到有可能指示父母考虑孩子的订购标志(基于消息来源)。
© www.soinside.com 2019 - 2024. All rights reserved.