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

Can I give an additional label for a TextView that's only announced by TalkBack, not shown visually?

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

<TextView
    android:id="@+id/message" 
    style="@style/DefaultText"                    
    />    

视觉上不需要标签;列表项布局非常清晰。但是听着 TalkBack 是如何读屏的,我觉得如果有一个 "label" 或描述会更好。这样 TalkBack 就会读出如下内容:

Message: [the actual dynamic message content]

我的问题是:是否可以为 TextView 添加 label/description,首先, 不会替换 TextView 内容,但会读取 连同它,其次,只影响 TalkBack(不是视觉呈现)?

我尝试了什么:

您可以使用此命名空间,它不会在实际屏幕上直观显示

xmlns:tools="http://schemas.android.com/tools"

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:text="your text"/>

在您的 XML 文件中,将重要性设置为 "no"。您也可以在 运行 时间使用 View.setImportantForAccessibility() API.

执行此操作
android:importantForAccessibility="no"

以编程方式你可以说:

view.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);

Example click here

click here for more info

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

在XML

中使用android:hint

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

[the actual dynamic message content] Message

根据我的需要,消息是可选的,这有一些缺点:即使 TextView 没有实际内容(我宁愿忽略它)也会宣布提示,在这种情况下也会显示提示视觉上(不是我想要的)。另外,我希望 TalkBack 在 实际文本之前 阅读提示。

以编程方式设置 contentDescription

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

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

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

有资源:

<string name="message_desc">Message: %s</string>