假设我有一个项目列表,每个项目中的一个视图是一个消息,在一个简单的TextView中,填充在代码中(来自后端服务的动态数据)。
<TextView
android:id="@+id/message"
style="@style/DefaultText"
/>
视觉上它不需要标签;列表项布局非常清楚。但是听听TalkBack如何阅读屏幕,我认为有一个标签&#34;或描述。因此,TalkBack会读取类似的内容:
消息:[实际的动态消息内容]
我的问题是:是否可以为TextView添加标签/描述,首先,不替换 TextView内容,但是与一起阅读 ,其次,只影响TalkBack (不是视觉呈现)?
我尝试了什么:
contentDescription
用于TextView。不起作用:如果设置,则不会宣布实际内容,仅 contentDescription
。嗯,也许如果我在代码中设置这个,并在实际内容前加上描述......但是没有更简单的方法吗?labelFor
指向@+id/message
的TextView分开。问题在于它也在视觉上显示出来并且搞砸了设计。如果我以某种方式使其不可见,似乎TalkBack也不会读它。 答案 0 :(得分:3)
好吧,我找到了两个解决方案!正如问题所述,我宁愿避免在代码中使用它,但似乎最佳结果是可行的方法。
android:hint
最简单的方法是为TextView设置android:hint="Message"
。在实际文本之后,TalkBack会将其读取为:
[实际的动态消息内容]消息
根据我的需要,消息是可选的,这有一些缺点:即使TextView没有实际内容(我也不想忽略它),也会宣布提示,在这种情况下它是&#39 ; s也在视觉上显示(不是我想要的)。另外,我更喜欢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>
答案 1 :(得分:0)
您可以使用此命名空间,而不是在真实屏幕上直观显示
xmlns:tools="http://schemas.android.com/tools"
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="your text"/>
答案 2 :(得分:-1)
在XML文件中,将重要性设置为“no”。您也可以使用View.setImportantForAccessibility()API在运行时执行此操作。
android:importantForAccessibility="no"
以编程方式,您可以说:
view.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);