为什么要设置 contentDescription
由于现在使用智能设备的人越来越多, 需求也越来越多样化. 根据统计, 目前我国有 1700 多万视障人士, 意味着平均每 81 人中就有一位视障人士可能会在使用互联网服务时遇到困难. Android 的无障碍设计就是针对视觉障碍人士, 如果用户在设备的辅助功能中开启无障碍服务 -- 比如 TalkBack, 它就能够读取屏幕上的文本信息并将其转化为语音提示以达到无障碍.
但是 Image 之类的图形是无法像文本一样的被朗读出来的, 所以我们需要为图片添加 contentDescription, 使图片具有可读性.
最简单的方法: 直接在 xml 中声明
以 ImageView 为例, 对于普通的控件我们可以直接在 xml 中定义其 contentDescription 属性
- <ImageView
- Android:id="@+id/image"
- Android:layout_width="@dimen/image_size"
- Android:layout_height="@dimen/image_size"
- Android:src="@drawable/im_image"
- Android:contentDescription="@string/grid_image" /> <!-- 直接定义 -->
使用 Java 设置
对于普通的控件, 我们可以在 xml 中直接定义, 但是在一些特殊的组件上就不行了. 比如笔者最近遇到的一个需求: 需要给 GridView 的 item 里的图片添加 contentDescription(item 使用自定义的 ImageView + TextView 布局)
如果直接在 xml 文件中定义 contentDescription 属性, 那所有 item 的图片描述都是同一个值, 无法发挥其真正的作用, 所以我们必须在适配器 (Adapter) 中, 定义每一个 item 里的图片描述.
设置 contentDescription 的语法
imageView.setContentDescription("String");
我在 GridAdapter.java 中定义 contentDescription 的完整 getView() 代码
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder viewHolder;
- if (convertView == null ) {
- // 加载子布局
- convertView = LayoutInflater.from(mContext).inflate(R.layout.gridview_item, parent, false);
- viewHolder = new ViewHolder();
- viewHolder.imageView = convertView.findViewById(R.id.gridImage);
- viewHolder.textView = convertView.findViewById(R.id.gridText);
- convertView.setTag(viewHolder);
- } else {
- viewHolder = (ViewHolder) convertView.getTag();
- }
- // gridDataList 是我存放 GridView 的 item 信息的数组
- viewHolder.imageView.setImageResource(gridDataList.get(position).getIconId());
- // 下面这行就是定义 contentDescription ↓↓↓↓↓
- viewHolder.imageView.setContentDescription(gridDataList.get(position).getName());
- viewHolder.textView.setText(gridDataList.get(position).getName());
- return convertView;
- }
- private class ViewHolder {
- ImageView imageView;
- TextView textView;
- }
来源: https://juejin.im/post/5c87a239e51d453c8f487a5b