5

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

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

视觉上它不需要标签;列表项布局非常清晰。但是听听 TalkBack 是如何读取屏幕的,我认为为它加上一个“标签”或描述会很有好处。这样 TalkBack 会显示如下内容:

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

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

我尝试了什么:

  • contentDescription对于文本视图。不起作用:如果设置,则不公布实际内容,仅公布contentDescription. 嗯,也许如果我在代码中设置这个,并在实际内容前面加上描述......但是没有更简单的方法吗?
  • 将 TextView 与labelFor指向分开@+id/message。问题是它也显示在视觉上并且搞砸了设计。如果我以某种方式使其不可见,则 TalkBack 似乎也不会读取它。
4

3 回答 3

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));
}

有资源:

<string name="message_desc">Message: %s</string>
于 2017-10-12T14:41:15.493 回答
-3

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

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

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:text="your text"/>
于 2017-10-12T13:00:45.867 回答
-3

在您的 XML 文件中,将重要性设置为“否”。您也可以在运行时使用 View.setImportantForAccessibility() API 执行此操作。

android:importantForAccessibility="no"

以编程方式,您可以说:

view.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);

示例点击这里

点击这里获取更多信息

于 2017-10-12T13:03:57.200 回答