XML中图像缺少contentDescription属性

247

我在eclipse中收到一个警告,提示[可访问性]图像缺少contentDescription属性。该警告出现在以下XML代码的第5行(声明ImageView)。

当构建和运行我的应用程序时,这不会产生任何错误。但我真的很想知道为什么会收到这个警告。

这是我的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content">
    <ImageView
        android:id="@+id/contact_entry_image"
        android:src="@drawable/ic_launcher"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <TextView
        android:id="@+id/contact_entry_text"
        android:text=""
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        />

</LinearLayout>
请帮我处理这个问题,感谢您的阅读。

7
新的ADT版本建议在ImageView中添加android:contentDescription属性,这只是一个建议,你可以忽略它,它不会导致编译错误。你也可以查看http://developer.android.com/reference/android/view/View.html#attr_android:contentDescription - idiottiger
是的,没错 - Rahul Kushwaha
9个回答

293

点击此链接查看解决方案: Android Lint contentDescription warning

通过为我的ImageView设置属性android:contentDescription,解决了这个警告。

android:contentDescription="@string/desc"

ADT 16中的Android Lint会抛出此警告,以确保图像小部件提供内容描述。

这定义了简要描述视图内容的文本。此属性主要用于辅助功能。由于某些视图没有文本表示形式,因此可以使用该属性来提供此类信息。

像ImageViews和ImageButtons这样的非文本小部件应使用contentDescription属性来指定小部件的文本描述,以便屏幕阅读器和其他辅助功能工具可以充分描述用户界面。

此链接用于解释: 无障碍性,其影响和开发资源

许多Android用户有残疾,需要以不同的方式与他们的Android设备交互。这包括那些由于视觉、身体或年龄相关的残疾而无法完全看到或使用触摸屏的用户。

Android提供辅助功能特性和服务,帮助这些用户更轻松地导航他们的设备,包括文本到语音、触觉反馈、轨迹球和D-pad导航等增强体验的功能。Android应用程序开发人员可以利用这些服务,使其应用程序更易于访问,并构建自己的辅助功能服务。

该指南是为了使您的应用程序易于访问: 使应用程序更易于访问

确保您的应用程序对所有用户都易于访问相对容易,特别是当您使用框架提供的用户界面组件时。如果您只为您的应用程序使用这些标准组件,那么只需要执行一些步骤即可确保您的应用程序易于访问:

  1. 使用android:contentDescription属性为您的ImageButtonImageViewEditTextCheckBox和其他用户界面控件进行标注。

  2. 确保您所有的用户界面元素都可以使用方向控制器(例如跟踪球或D-pad)访问。

  3. 通过打开TalkBack和Explore by Touch等辅助功能服务,尝试仅使用方向控制来使用您的应用程序,并对其进行测试。


112
还有一个重要的注意事项!在这种情况下,看起来图像纯粹只是装饰性的,没有向用户提供额外的信息。因此,例如,您不想对用户说“联系人图片”,但如果您在其他地方没有显示该文本,您可能希望说“Bob的个人资料照片”。如果一张图片不应该被朗读给用户,您可以将android:contentDescription设置为"@null",那么警告就会消失。 - alanv
1
@alanv:非常好的评论。比通常建议完全禁用警告要好得多。 - ChiefTwoPencils
14
实际上,我认为android:contentDescription="@null"并不是最好的解决方案。我正在使用tools:ignore="ContentDescription",这才是真正的解决方法。请确保在根布局中包含xmlns:tools="http://schemas.android.com/tools"。 - Sotti
感谢您提供如此好的文档。当您拥有像壁纸画廊应用程序这样的许多图像时,是否适合为所有图像添加内容描述?同时,这是否会影响应用程序的性能? - Rahul Mandaliya
当在接口中使用某些类型的视图时,它们必须包含描述与该视图相关的目的或操作的内容标签。 - MarkT

71
添加 android:contentDescription="@string/description" (静态或动态) 到你的 ImageView。请不要忽略或过滤该消息,因为这对于使用替代输入方法的残障人士非常有帮助(例如 TalkBack、Tecla Access Shield 等等)。

@Jeroen - 当我添加描述时,它显示:“无法解析资源 @string/loginText”- 为什么会这样? - Jamal Zafar
你的 string XML 文件中有 loginText 字符串吗? - Praveen
1
@JamalZafar 在 string.xml 中创建一个名为 loginText 的字符串。 - Ayush Goyal
通常情况下,图案应该是@string/accessibility_your_description。 - Tejas

43

更新:

评论中指出,将描述设置为null表明图像纯粹是装饰性的,并且屏幕阅读器(如TalkBack)会理解这一点。

旧答案,本人不再支持此答案:

对于所有想要避免警告的人:

我认为android:contentDescription="@null"不是最好的解决方案。

我正在使用tools:ignore="ContentDescription",这才是意思所在。

确保在根布局中包含xmlns:tools="http://schemas.android.com/tools"


1
这个应该被点赞,因为这也是Google推荐的。 - Le Dinh Nhat Khanh
8
使用@null作为contentDescription是明确表明该图像纯粹是装饰性的一种方式。简单地忽略警告并不是正确的解决方法。 - karl
4
使用@null告诉TalkBack该图片是装饰性的。您不应忽略警告,因为使用@null会通知TalkBack而不是让它认为图片丢失了应该出现在那里。 - Ali Bdeir

21

未来,对于纯粹装饰性图形元素,最好的解决方案是使用:

android:importantForAccessibility="no"

如果您的最低SDK版本至少为16,则这是有意义的,因为运行较低版本的设备将忽略此属性。

如果您需要支持旧版本,请使用(正如其他人已经指出的那样):

android:contentDescription="@null"

来源:https://developer.android.com/guide/topics/ui/accessibility/apps#label-elements


11

添加

tools:ignore="ContentDescription"

针对您的图像,请确保您在根布局中有xmlns:tools="http://schemas.android.com/tools"


1
+1. 这是Android Studio针对此问题的修复方法(当您执行代码分析时,“抑制Lint”按钮就是这样做的) - noamgot
2
请注意,您需要确定ImageView代表的是装饰性的内容还是重要的内容。请查看这里的其他选项。 - jj.

11

这个警告旨在改善您的应用程序的可访问性。

如果要禁用整个项目中缺少内容描述的警告,请将以下内容添加到您的应用程序模块 build.gradle 文件中:

android {

    ...

    lintOptions {
        disable 'ContentDescription'
    }
}

10

这个警告确实很烦人,在许多(大多数!)情况下,各种装饰性ImageView不需要contentDescription。解决问题最彻底的方法就是告诉Lint忽略此检查。在Eclipse中,转到“首选项/Android/Lint错误检查”,找到“contentDescription”(它在“可访问性”组中),并将“严重性:”更改为“忽略”。


9
请勿忽略此警告。正如其他人所指出的那样,即使只是装饰性图片,可访问性也很重要。添加所需的contentDescription并不是什么大不了的事情。 - jamesc
2
如果您的应用程序即使具有内容描述也基本上无法访问,那么您可以忽略此警告。例如,在需要视觉才能玩的游戏中,为什么要使用“contentDescription”呢? - CorayThan
是的,这确实是一个激进的选择;那么那些意识到其目的并希望遵守的人该怎么办呢?在这种特殊情况下,我敢说,忘掉“大多数”情况;似乎这暗示着因为“大多数”人不是盲人,所以这是一个不必要的警告?如果“大多数”图像不需要这样的内容-好的,禁用警告,但在有意义的地方添加它。稍微有点帮助就可以走得更远。 - ChiefTwoPencils
值得注意的是,许多使用屏幕阅读器或辅助技术的人都有一定的视力,因此可能能够玩游戏,但无法阅读或看到某些文本、图标、图像或颜色。因此,提供相关的内容描述可能会帮助人们,即使您无法预见到这一点。 - Zac

9

如果您完全不关心,请执行以下操作:

    android:contentDescription="@null"

虽然我会建议采用正规解决方案,但是以下这种方法也可以称作“hack” :D


4
实际上,我认为android:contentDescription="@null"并不是最好的解决方案。我正在使用tools:ignore="ContentDescription",这才是正确的做法。请确保在根布局中包含xmlns:tools="http://schemas.android.com/tools"。 - Sotti
1
没有人说过那个。再次阅读评论。你只是忽略了警告,所以你提供的解决方案肯定更糟。再次阅读最受欢迎的答案。 - alap

3

这个警告是因为图像描述没有定义。

我们可以通过在Strings.xml和activity_main.xml中添加以下代码来解决此警告。

在Strings.xml中添加以下行

<string name="imgDescription">Background Picture</string>
you image will be like that:
<ImageView
        android:id="@+id/imageView2"
        android:lay`enter code hereout_width="0dp"
        android:layout_height="wrap_content"
        android:contentDescription="@string/imgDescription"
        app:layout_editor_absoluteX="0dp"
        app:layout_editor_absoluteY="0dp"
        app:srcCompat="@drawable/background1"
        tools:layout_editor_absoluteX="0dp"
        tools:layout_editor_absoluteY="0dp" />

也要在activity_main.xml中添加这一行

android:contentDescription="@string/imgDescription"

Strings.xml

<resources>
    <string name="app_name">Saini_Browser</string>
    <string name="SainiBrowser">textView2</string>
    <string name="imgDescription">BackGround Picture</string>
</resources>

谢谢,与其忽略警告,每个人都应该理解发生了什么,感谢Kuldeep Singh先生。 - Aathil Ahamed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接