{"id":1310,"date":"2025-09-19T00:00:00","date_gmt":"2025-09-18T22:00:00","guid":{"rendered":"https:\/\/programaraciegas.net\/?p=1310"},"modified":"2025-08-24T09:52:48","modified_gmt":"2025-08-24T07:52:48","slug":"como-etiquetar-imagenes-y-componentes-visuales-en-android-con-content-description","status":"publish","type":"post","link":"https:\/\/programaraciegas.net\/?p=1310","title":{"rendered":"C\u00f3mo etiquetar im\u00e1genes y componentes visuales en Android con Content Description"},"content":{"rendered":"<p>En el desarrollo de aplicaciones para Android, la accesibilidad es un aspecto que no puede dejarse de lado. Uno de los errores m\u00e1s comunes en las interfaces de aplicaciones m\u00f3viles es utilizar iconos o im\u00e1genes sin acompa\u00f1arlos de una descripci\u00f3n accesible. Para los usuarios que dependen de TalkBack u otros lectores de pantalla, estos elementos pueden convertirse en barreras de accesibilidad muy severas si no cuentan con la informaci\u00f3n adecuada para identificar la funcionalidad de dichos botones o elementos visuales.<\/p>\n<p>La propiedad <strong>contentDescription<\/strong> permite a\u00f1adir una etiqueta textual a cualquier componente visual, de forma que TalkBack la anuncie en lugar de limitarse a leer un nombre t\u00e9cnico como \u201cic_send\u201d o a ignorar la imagen por completo.<\/p>\n<h2>Ejemplo b\u00e1sico en XML<\/h2>\n<p>Un caso cl\u00e1sico es un bot\u00f3n con un icono de avi\u00f3n de papel que representa la acci\u00f3n de enviar un mensaje. Visualmente resulta evidente, pero sin descripci\u00f3n accesible no es comprensible para quien no puede ver la pantalla:<\/p>\n<pre>&lt;ImageButton<br \/>  android:id=\"@+id\/sendButton\"<br \/>  android:layout_width=\"wrap_content\"<br \/>  android:layout_height=\"wrap_content\"<br \/>  android:src=\"@drawable\/ic_send\"<br \/>  android:contentDescription=\"Enviar mensaje\" <br \/>\/&gt;<\/pre>\n<p>En este ejemplo, TalkBack leer\u00e1 \u201cEnviar mensaje\u201d al situarse sobre el bot\u00f3n, en lugar de un nombre de archivo t\u00e9cnico.<\/p>\n<h2>Ejemplo con Jetpack Compose<\/h2>\n<p>En Compose, la accesibilidad se maneja mediante modificadores de sem\u00e1ntica. El equivalente a contentDescription ser\u00eda:<\/p>\n<pre>IconButton(<br \/>  onClick = { \/* Acci\u00f3n para enviar *\/ },<br \/>  modifier = Modifier.semantics { contentDescription = \"Enviar mensaje\" }<br \/>) {<br \/>  Icon(<br \/>    imageVector = Icons.Default.Send,<br \/>    contentDescription = null \/\/ Evitamos redundancia<br \/>  )<br \/>}<\/pre>\n<p>En este ejemplo el bot\u00f3n anuncia la etiqueta \u201cEnviar mensaje\u201d al interactuar con TalkBack. El icono interno no necesita contentDescription porque ya se ha definido en el contenedor.<\/p>\n<h2>Buenas pr\u00e1cticas<\/h2>\n<p>La propiedad contentDescription es sencilla de usar, pero conviene aplicarla con criterio:<\/p>\n<ol>\n<li>Priorizar la funci\u00f3n: un icono de engranaje para un bot\u00f3n para ir a los ajustes de la app no deber\u00eda describirse como \u201crueda dentada\u201d, sino como \u201cAjustes\u201d, que es la acci\u00f3n real.<\/li>\n<li>Ser breve y claro: descripciones cortas facilitan la navegaci\u00f3n. Un bot\u00f3n que abre un chat debe decir \u201cAbrir chat\u201d, no \u201cIcono de burbuja de di\u00e1logo para iniciar conversaci\u00f3n\u201d.<\/li>\n<li>Evitar redundancias: si un TextView ya tiene texto visible, no es necesario repetirlo en contentDescription. TalkBack lo leer\u00e1 autom\u00e1ticamente.<\/li>\n<li>Ocultar lo decorativo: para im\u00e1genes que solo son decorativas, se debe establecer android:contentDescription=\u00bb@null\u00bb en XML o contentDescription = null en Compose. De esta forma TalkBack las ignora.<\/li>\n<\/ol>\n<p>Etiquetar adecuadamente los componentes visuales no solo es una buena pr\u00e1ctica de desarrollo, sino un compromiso con la inclusi\u00f3n digital. Al igual que ocurre con cualquier aspecto del dise\u00f1o, dedicar unos segundos a escribir una descripci\u00f3n accesible marca la diferencia entre una app usable y otra que excluye a parte de sus usuarios. La propiedad contentDescription es una de las herramientas m\u00e1s simples y a la vez m\u00e1s poderosas que Android pone en manos de los desarrolladores para mejorar la accesibilidad. A\u00f1adir una descripci\u00f3n clara y precisa a im\u00e1genes e iconos garantiza que los usuarios con lectores de pantalla comprendan e interact\u00faen con la interfaz en igualdad de condiciones.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En el desarrollo de aplicaciones para Android, la accesibilidad es un aspecto que no puede dejarse de lado. Uno de los errores m\u00e1s comunes en las interfaces de aplicaciones m\u00f3viles es utilizar iconos o im\u00e1genes sin acompa\u00f1arlos de una descripci\u00f3n accesible. Para los usuarios que dependen de TalkBack u otros lectores de pantalla, estos elementos &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/programaraciegas.net\/?p=1310\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \u00abC\u00f3mo etiquetar im\u00e1genes y componentes visuales en Android con Content Description\u00bb<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[25,238,9,6,29],"tags":[11,248,87],"class_list":["post-1310","post","type-post","status-publish","format-standard","hentry","category-android","category-android-wear","category-software-accesible","category-programacion","category-talkback","tag-accesibilidad-2","tag-android","tag-programacion-2"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts\/1310","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1310"}],"version-history":[{"count":0,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts\/1310\/revisions"}],"wp:attachment":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1310"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1310"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1310"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}