我向ListView添加了一个标头。header有几个组件(Button、TextViews、RelativeLayouts)。当对讲功能打开并选择标题时,将读取整个标题,并且您不能选择单个组件。不过,这些按钮是可选择的,对讲功能会读取它们。但是文本视图并不是分开的。
如何让对讲功能将报头中的所有组件视为单独的组件?
发布于 2015-11-04 22:30:13
答案很简单:你不能。
TalkBack试图通过收集列表视图单元格中的所有信息( read : not active)信息(标题视图仍然是列表视图的一部分),并将其作为一个元素读出,从而变得聪明。这会将该单元格中的任何信息关联在一起,我相信通过将对象放置在其中的布局标记为importantForAccessibility,虽然使用特定的ListView单元格逻辑可能会发生一些TalkBack魔术。
例如,如果您的单元格如下所示:
Name: Chris
Address: Blah blah blah
Name: Herman
Address: Blarg blarg blarg
每个单元格都会读出:
Name: Chris Adress Blah Blah Blah
这是有益的,因为没有排序/数据关联问题。如果数据没有打包在一起呢?地址是属于Chris (它前面的名字)还是Herman(它后面的名字)?在此等式中忽略活动元素,因为活动元素需要...很活跃。因此必须是单独可聚焦的,以便用户可以与它们交互。
人们当然可以争论这种方法相对于允许开发人员犯下不正确的数据关联的错误的相对优点,但是已经做出了决定,你被困住了。
如果你真的关心,你可以重新发明轮子,创建你自己的列表视图,使用线性布局,这真的不是那么难。在这种情况下,你当然可以得到你想要的任何行为。或者,将标题放在单独的布局中,而不是使用ListViews标题单元格。
假设,如果我对ListView单元格使用" isImportantForAccessibility“的假设是它的实现方式(而不是ListViews的一些TalkBack魔术),那么你可以在绘制之后爬升视图层次结构到单元格布局(所以Android Framework已经用它自己的方式),并将isImportantForAccessibility重置为no。不过,我强烈建议不要使用这种方法,因为
答:我不确定它是否会工作,这只是一个假设(不,我不会亲自测试它)。如果这方面的逻辑确实是在TalkBack方面,那么除非您想重新发明ListViews或编写自己的屏幕阅读器,否则您真的是大错特错了。
B:一般来说,TalkBack试图做的这些聪明的事情有助于提高可访问性,而不是损害它。除非你真正了解可访问性,否则最好让Android来做它自己的事情。
发布于 2015-11-06 05:40:52
我发现,如果我将textviews设置为textIsSelectable(true),Talkback会将这些textviews识别为可以选择的元素。为了不在对讲机未被激活时改变我的应用程序的功能,我使用AccessibilityManager来检查是否激活了对讲机。
https://stackoverflow.com/questions/33506241
复制相似问题