我可以为仅由 TalkBack 宣布的 TextView 提供一个额外的标签,而不是在视觉上显示吗?

Jon*_*nik 5 android textview talkback android-accessibility

假设我有一个项目列表,每个项目中的一个视图是一条消息,在一个简单的 TextView 中,它填充在代码中(来自后端服务的动态数据)。

<TextView
    android:id="@+id/message" 
    style="@style/DefaultText"                    
    />    
Run Code Online (Sandbox Code Playgroud)

视觉上它不需要标签;列表项布局非常清晰。但是听听 TalkBack 如何读取屏幕,我认为为其添加“标签”或描述会有所帮助。这样 TalkBack 会读到类似的内容:

留言:【实际动态留言内容】

我的问题是:是否可以为 TextView 添加标签/描述,首先,它不会替换TextView 内容,但会与其一起阅读,其次,仅影响 TalkBack(而不是视觉呈现)?

我试过的:

  • contentDescription对于文本视图。不起作用:如果设置,实际内容没有公布,只是contentDescription。嗯,也许如果我在代码中设置它,并在实际内容之前添加描述......但是没有更简单的方法吗?
  • 将 TextViewlabelFor指向@+id/message. 问题是它也被直观地显示出来并搞砸了设计。如果我让它不可见,以一种或其他方式,似乎 TalkBack 也不会读取它。

Jon*_*nik 5

好吧,我找到了两个解决方案!正如问题中所提到的,我宁愿避免在代码中执行此操作,但似乎是要获得最佳结果。

android:hint在 XML 中使用

最简单的方法是android:hint="Message"为TextView设置。TalkBack在实际文本之后读取:

[实际动态消息内容] 消息

对于我的需要,由于消息是可选的,这有一些缺点:即使 TextView 没有实际内容,也会宣布提示(那时我更愿意省略它),在这种情况下,它也会以视觉方式显示(不是我所看到的)想)。另外,我更喜欢 TalkBack在实际文本之前阅读提示。

contentDescription编程方式设置

没有那么简单,但也不复杂,您可以完全控制 TalkBack 所说的内容。

在我的情况下,如果消息丢失并在消息内容之前阅读它,我宁愿省略描述,我会在填充列表项的代码中做这样的事情:

textView.setText(message);
if (!TextUtils.isEmpty(message)) {        
    textView.setContentDescription(
        context.getString(R.string.message_desc, message));
}
Run Code Online (Sandbox Code Playgroud)

有资源:

<string name="message_desc">Message: %s</string>
Run Code Online (Sandbox Code Playgroud)