我可以为仅由 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(不是视觉呈现)?
我尝试了什么:
contentDescription
用于 TextView。不起作用:如果设置,实际内容不公布,仅 contentDescription
。嗯,也许如果我在代码中设置它并在实际内容前面加上描述...但是没有更简单的方法吗?
- 将 TextView 与
labelFor
指向 @+id/message
分开。问题是它也以视觉方式显示并搞砸了设计。如果我以某种方式使其不可见,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);
好的,我找到了两个解决方案!正如问题中所提到的,我宁愿避免在代码中这样做,但似乎要获得最佳结果才行。
在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>
假设我有一个项目列表,每个项目中的一个视图是一条消息,在一个简单的 TextView 中,用代码填充(来自后端服务的动态数据)。
<TextView
android:id="@+id/message"
style="@style/DefaultText"
/>
视觉上不需要标签;列表项布局非常清晰。但是听着 TalkBack 是如何读屏的,我觉得如果有一个 "label" 或描述会更好。这样 TalkBack 就会读出如下内容:
Message: [the actual dynamic message content]
我的问题是:是否可以为 TextView 添加 label/description,首先, 不会替换 TextView 内容,但会读取 连同它,其次,只影响 TalkBack(不是视觉呈现)?
我尝试了什么:
contentDescription
用于 TextView。不起作用:如果设置,实际内容不公布,仅contentDescription
。嗯,也许如果我在代码中设置它并在实际内容前面加上描述...但是没有更简单的方法吗?- 将 TextView 与
labelFor
指向@+id/message
分开。问题是它也以视觉方式显示并搞砸了设计。如果我以某种方式使其不可见,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);
好的,我找到了两个解决方案!正如问题中所提到的,我宁愿避免在代码中这样做,但似乎要获得最佳结果才行。
在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>