我是否可以为仅由TalkBack宣布的TextView提供额外标签,而不是直观显示?

时间:2017-10-12 12:51:58

标签: android textview talkback android-accessibility

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

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

视觉上它不需要标签;列表项布局非常清楚。但是听听TalkBack如何阅读屏幕,我认为有一个标签&#34;或描述。因此,TalkBack会读取类似的内容:

  

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

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

我尝试了什么:

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

3 个答案:

答案 0 :(得分:3)

好吧,我找到了两个解决方案!正如问题所述,我宁愿避免在代码中使用它,但似乎最佳结果是可行的方法。

在XML

中使用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);

Example click here

click here for more info