Android Accessibility知识分享

news2024/9/22 15:40:09

工具

工欲善其事,必先利其器。下面我们介绍一下工具来发现我们的accessibility问题。感谢这篇文章的分享:https://www.kodeco.com/240-android-accessibility-tutorial-getting-started

  • Lint:这个工具是google提供的,在android studio上直接可以使用。默认是启用的。请添加图片描述
    它的使用也相当简单,当你在编辑你的布局文件时,它就起作用了。如:
    请添加图片描述
  • Accessibility Scanner 扫描器
    这是google提供给开发者的一个accessibility扫描器。大家可以去网上搜索这个app,然后把它下载下来,或者去在这个地方下载。
    安装好后,可以按Settings/Accessibility/Accessibility Scanner,打开扫描器:
    在这里插入图片描述

打开扫描器后,打开我们的app,此时会有一个蓝色按钮,点击它,扫描器就会扫描我们的app,然后就会给出结果,还要修改的建议。

Accessibility问题修复指导

android:contentDescription

用这个属性来描述我们的视图,如果我们的组件是继承或是Button类型,那么我们的screen reader会识别出它是按钮,并且告诉用户可以点击去激活它。所以我们只需要在这个属性提供关于视图的描述即可。

如果我们想screen reader跳过这个元素,移动到下一个,那么我们就可以将其android:contentDescription设置为@null ,或者添加一个属性android:isImportantForAccessibility并设置为 ”no”

组合内容

    <LinearLayout
        android:id="@+id/consumedContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:focusable="true"
        android:focusableInTouchMode="false">

      <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_weight="1"
          android:text="@string/amount_consumed"
          android:textAppearance="@style/TextAppearance.AppCompat.Title"/>

      <TextView
          android:id="@+id/amountConsumed"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_gravity="end"
          android:layout_weight="1"
          android:textAlignment="textEnd"
          android:textAppearance="@style/TextAppearance.AppCompat.Title"
          tools:text="3 of 5"/>
    </LinearLayout>

请添加图片描述
如果我们的screen reader先读“Amount Consumed”,等到划到下一个,才读"3 of 5",那么这个体验就真得很差.
请添加图片描述

如果能够让screen reader将两个元素一起读的话,也就是让它们同时获得焦点,体验就会很好,如下图:
请添加图片描述
我们可以采用组合的方式来实现:在它们的父元素LinearLayout加上android:focusable,设置值为true,再加上android:focusableInTouchMode,并设置值为false,因为我们只想让screen reader获得焦点。

    <LinearLayout
        android:id="@+id/consumedContainer"
        ...![请添加图片描述](https://img-blog.csdnimg.cn/92ed0ee33a744e82a4262f56b953b1fd.png)

        android:focusable="true"
        android:focusableInTouchMode="false">
		...

    </LinearLayout>

Labels

上面因为是只读的,所以组合在一起会比较合理,但是如果是下面这种情况呢?

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

      <TextView
          android:id="@+id/coffeeLimitLabel"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_gravity="start|center_vertical"
          android:layout_weight="1"
          android:text="Coffee Limit"
          android:textAppearance="@style/TextAppearance.AppCompat.Title"/>

      <EditText
          android:id="@+id/coffeeLimitValue"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_gravity="end"
          android:layout_weight="1"
          android:hint="Limit"
          android:inputType="number"
          android:text="@string/default_coffee_limit"
          android:textAlignment="textEnd"/>
    </LinearLayout>

在这里插入图片描述
右边是一个输入框,也就是说在这里,我们其实想告诉我们的用户这里要请他/她输入Coffee Limit的数量。但是目前的实现就是先读了左边,再读右边,那么如果用户是连续的滑动,那或许还能听懂5的意思,那万一是隔了好一会才滑过去的,只听到5的话,就不知所谓了。所以分开他们不是很好,最好的实践应该是,当焦点在输入框上时,我们就要告诉用户这里是用来干什么的。具体我们可以这样做,在Coffee Limit的组件上使用android:labelFor属性,它的值设置成输入框的id值。

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

      <TextView
          android:id="@+id/coffeeLimitLabel"
          ...
          android:labelFor="@id/coffeeLimitValue"/>

      <EditText
          android:id="@+id/coffeeLimitValue"
          .../>
    </LinearLayout>

这样设置过后,当焦点在输入框时,screen reader就会读:limit for “Coffee Limit”。

改变遍历次序

请添加图片描述
比如说,我们现在要让右下角的“+”按钮先于“Amount Consumed 0 of 5”先被screen reader读到,我们可以在“+”按钮加上一个属性android:accessibilityTraversalBefore,将其值设置成@+id/consumedContainer. 类似的属性还有android:accessibilityTraversalAfter

announceForAccessibility()

如果我们的用户完成了一些操作,我们想通知他/她结果。那么就可以在某个view上调用announceForAccessibility()播报给用户听。

    binding?.addCoffee?.setOnClickListener {
      coffeeRepo.increment()
      showCount()
      binding?.amountConsumed?.announceForAccessibility("Limit is increased to 8")
    }

上述例子,就是在用户点击“+”按钮时,通知用户:“Limit is increased to 8”

根据本文中的链接,Google推荐任务可点击的组件大小至少是48dp。这与iOS的不一样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98960.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python--面向对象以及其三大特性(封装、继承、多态)

文章目录前言一、面向过程二、 面向对象三、面向对象的三大特性一、封装二、继承私有属性和私有方法三、多态四、高级特性单例模式前言 这一节主要学习面向对象以及面向对象的三大特性&#xff1a;封装、继承、多态&#xff1b;还有高级特性&#xff1a;类方法、静态方法、pro…

【OpenFeign】【源码+图解】【二】注册OpenFeign接口的实例

【OpenFeign】【源码图解】【一】HelloWorld及其工作原理 目录3. 注册OpenFeign接口的实例3. 注册OpenFeign接口的实例 从HelloWorld中我们看到需要显示加入**EnableFeignClients注解才能开启openFeign的功能&#xff0c;因此它就成为我们分析openFeign**的入口&#xff0c;先…

Chrony时间同步服务

目录 一、时间同步 1.概念 2.时间同步在运维工作中的作用 3.时间同步完成方法 &#xff08;1&#xff09;NTP时间服务&#xff08;centos 6 &#xff09; &#xff08;2&#xff09;Chrony时间服务 二、Chrony时间服务 1.Chrony介绍 2.Chrony的优点 三、Chrony安装 …

逻辑回归(Logistic Regression)原理及过程

目录 一&#xff1a;逻辑回归简介 二&#xff1a;逻辑回归原理 三&#xff1a;逻辑回归 损失函数 四&#xff1a;逻辑回归 梯度下降算法 五&#xff1a;逻辑回归 过程 一&#xff1a;逻辑回归简介 Logistic模型是1938年Verhulst-Pearl在修正非密度方程时提出来的&#xf…

算法刷题打卡第49天:排序数组---计数排序

排序数组 难度&#xff1a;中等 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;nums [5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5]计数排…

我与世界杯的故事——达利奇:铜牌闪耀着金光

目录 克罗地亚球队的历史 奇迹出现 心得总结 克罗地亚球队的历史 克罗地亚球队拥有悠久的历史&#xff1a; 1998年首次亮相法国世界杯&#xff0c;克罗地亚就以季军的战绩惊艳众人。 2018年的俄罗斯世界杯&#xff0c;虽然格子军团在决赛中不敌强大的法国&#xff0c;遗憾地…

<Linux进程通信之共享内存>——《Linux》

目录 一、system V共享机制 1.共享内存示意图 2.共享内存数据结构 3.共享内存函数 3.1shmget函数 3.2 shmat函数 3.3 shmdt函数 3.4 shmctl函数 3.5 实例代码&#xff1a; 3.6 结果演示&#xff1a; 4. 创建共享内存 5. 基于共享内存与管道进行访问控制的共享内存读…

(P4)Python plt显示图像

Python plt显示图片 本地可以显示&#xff0c;服务器操作不太行。 plt.plot(x,y) plt.imshow(image) plt.show() # 显示图像&#xff08;曲线/图片都需要这一行&#xff09; plt.savefig(xx.png) # 保存图片 fig.savefig(xx.png) 功能相同 # 保存图片在本地执行失败&#xff…

Elasticsearch学习笔记

Elasticsearch学习笔记 ----第1章 Elasticsearch概述-01-开篇02-技术选型03-教学大纲-第2章 Elasticsearch入门-04-入门-环境准备05-入门-RESTful & JSON06-入门-Postman客户端工具07-入门-倒排索引08-入门-HTTP-索引-创建09-入门-HTTP-索引-查询 & 删除10-入门-HTTP-…

Linux 调试之 TRACE_EVENT(一)

文章目录前言一、TRACE_EVENT简介二、TRACE_EVENT() 结构2.1 TRACE_EVENT简介2.2 trace_sched_switch示例2.2.1 Name2.2.2 Prototype2.2.3 Arguments2.2.4 Structure2.2.5 Assignment2.2.6 Print2.3 Format file2.3.1 tracing/events/2.3.2 perf2.3.3 bpftrace2.3.4 bcc2.3.5 S…

逻辑回归 鸢尾花分类预测

目录 一&#xff1a;加载数据 二&#xff1a;数据集划分 三&#xff1a;选择算法 四&#xff1a;网格模型 超参数最优解 五&#xff1a;鸢尾花分类预测 六&#xff1a;预测与实际比对 七&#xff1a;完整源码分享 一&#xff1a;加载数据 from sklearn.datasets import…

Jenkins启动项目时报错问题

问题 在工作中使用jenkins进行项目部署启动时遇到问题&#xff0c;项目构建成功但是发布时一直显示时间增加&#xff0c;但是项目本身并没有问题&#xff0c;使用传统方法部署项目也能正常启动。报错如下图所示&#xff1a; 解决方法 是由于jenkins文件中打印日志的问题&am…

PayPal,Stripe,Square轮询支付系统

轮询展示 展示我们轮询的页面 轮询套餐 根据不同的用户和需求&#xff0c;可以选择不同的套餐 普通版 1500元 1年 1个用户 支持Paypal/Stripe 不限制A站个数 不限制B站个数 不限制提交模式 订单管理 物流管理 风控管理 必要的网站数据处理 24小时远程协助 开始…

springcloud服务消费与熔断

今天与大家分享服务消费与熔断&#xff0c;就是说当我们服务消费者转发到服务生产者时&#xff0c;如果有那一步出现了问题或者error&#xff0c;可以进行服务熔断&#xff08;服务降级&#xff09;&#xff0c;为了补救系统问题&#xff0c;不让用户使用时看见error报错信息&a…

《Java》String、StringBuffer、StringBuilder有什么区别?

目录 String StringBuffer StringBuilder 总结 ps&#xff1a;昨天在讨论完String的不可变性之后突然想要做一份总结笔记&#xff0c;总结一下String、StringBuffer、StringBuilder的区别 String String是Java中的基础类&#xff0c;提供了各种构造和对字符串的基本操作&am…

Cocos Creater(3.6.1)开发笔记——Typscript

文章目录项目入门关于cocos creator 3.x关于TypeScript新建项目VS setting json配置屏蔽项事件节点添加脚本&#xff08;事件&#xff09;案例代码素材使用技巧素材组合固定布局&#xff08;类似css&#xff09;项目入门 关于cocos creator 3.x 相当于cocos所有版本的功能的综…

初探MapReduce

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录MapReduce核心思想MapReduce编程模型MapReduce编程实例——词频统计思路1、Map阶段&#xff08;映射阶段&#xff09;2、Reduce阶段&#xff08;归并阶段&#xff09…

VS2019下C#调用C++ DLL详解+数据转换

VS2019下C#调用C DLL详解数据转换 -C#调用OpenCV&#xff08;c的.dll主要有两种常见的方式&#xff1a;托管和非托管两种形式&#xff01; 非托管的形式即是采用[DllImport]的形式&#xff0c;这种形式只能调用的C的函数&#xff0c;适合用于简单的图形处理调用&#xff0c;这也…

正交编码器溢出处理

文章目录1.正交编码器1.1 参数特性1.2 应用范围2.正交编码器使用2.1 溢出问题2.2 中断模式2.3 循环模式延伸1.正交编码器 正交编码器一般指的是增量式光栅&#xff08;磁栅&#xff09;编码器&#xff0c;通常有三路输出信号&#xff0c;A相、B相、Z相&#xff0c;俗称ABZ编码器…

【2022年度系列工作总结】「国内软件质量调查问卷」针对于本年度软件质量分析总结报告

前提背景 针对于目前的软件行业而言&#xff0c;软件的质量目前越来越被大家所在关注&#xff0c;慢慢的QA以及SQA的角色也变得愈加重要。接下来我就针对于我司&#xff08;XXX&#xff09;的相关的实际开发情况对应的【2022年国内软件质量调查问卷】&#xff0c;为大家梳理和…