——内容描述、焦点导航与可达性事件实战指南)
文档教程移动开发【免费下载链接】android-training-course-in-chineseAndroid官方培训课程中文版项目地址https://gitcode.com/gh_mirrors/an/android-training-course-in-chinese点击查看免费下载本指南源自 Android 官方培训课程中文版仓库中的 开发辅助程序 一课。它面向 Android 应用开发者讲解如何利用 Android 平台内置的可达性Accessibility特性为视觉或生理上有障碍的用户优化应用包括为 UI 元素添加内容描述Content Description、设计可用的焦点导航Focus Navigation、触发可达性事件Accessibility Event并通过 TalkBack 与方向键完成测试验证。读完本文你将掌握一套可直接落地到日常开发中的无障碍改造方案。Android 平台本身具备一些专注于可达性的特性能够帮助你专门为视觉或生理上有缺陷的用户做特别优化。然而正确的优化方式、或者最简单利用这些特性的方法往往并不显而易见。本文对应官方课程Making Applications Accessible将演示如何利用和实现这些策略与平台特性构建一个更友好、更具可达性的 Android 应用。可达性改造的四个核心步骤在 实现辅助功能 的总览中Android 框架的可达性能力被概括为两大方向一是让应用自身更易用焦点导航与内容描述二是创建 Accessibility Service 来帮助用户与任意应用交互。本课聚焦前者核心脉络如下添加内容描述Content Descriptions为 UI 元素提供可被朗读的语义标签设计焦点导航Focus Navigation让应用在键盘、十字键D-pad、轨迹球等非触摸输入方式下依然可操作触发可达性事件Accessibility Events让自定义 View 在正确时机向 Accessibility Service 广播状态变化测试你的程序借助 TalkBack 与方向控制器验证改造效果。添加内容描述为 UI 元素提供可朗读的语义一个设计良好的交互界面其元素通常不需要额外标签也能表明作用。例如任务型应用中项目旁边的勾选框、文件管理应用中代表删除的垃圾桶图标对普通用户来说含义一目了然。然而对于有视觉障碍的用户这类只可意会的 UI 提示是不够的——他们依赖屏幕阅读器如 TalkBack通过语音描述来理解界面。幸运的是给一个 UI 元素加上标签非常容易类似 TalkBack 这样基于语音的 Accessibility Service会将元素的标签内容朗读出来。静态描述XML 中的 android:contentDescription如果你的标签在整个应用生命周期中不太可能发生变化比如停止、购买这类固定动作可以直接在 XML 布局文件中通过android:contentDescription属性设置Button android:idid/pause_button android:srcdrawable/pause android:contentDescriptionstring/pause/将描述文本放到字符串资源string/pause中既便于统一管理与本地化也符合 Android 资源使用的惯例。仓库中 创建自定义 View 一课的清单也把使用android:contentDescription属性标记输入字段列为自定义视图可达性的基本要求之一可见这一属性是应用级无障碍的基础设施。动态描述运行时 setContentDescription()在很多场景下描述内容是随上下文变化的比如一个开关按钮的当前状态或者 ListView 中某一项可选数据的具体内容。此时应在运行时通过setContentDescription()方法更新描述String contentDescription Select strValues[position]; label.setContentDescription(contentDescription);把列表项的具体值如任务标题拼进描述屏幕阅读器就能向用户完整播报选中了哪一项而不是千篇一律的列表项。内容描述的实践分寸将上述功能加入代码是提升应用可达性最简单的一步。建议把有用的地方都加上内容描述但要注意分寸——避免像部分 Web 开发者那样把所有元素都标注一遍那会产生大量无用信息、干扰用户浏览。例如不要把应用图标的内容描述设置为应用图标这类废话只会增加噪音。原则是只标注承载语义的元素且描述要具体、有用。立即验证用 TalkBack 听一听完成标注后可以下载 TalkBackGoogle 出品的可达性应用在Settings Accessibility TalkBack中开启它然后操作你的应用听听 TalkBack 发出的语音提示是否符合预期。这一验证手段在后文测试你的程序中会再次使用。设计焦点导航让应用不依赖触摸也能操作你的应用除了支持触摸操作外更应该支持其他导航方式。很多 Android 设备不仅提供触摸屏还提供十字键D-pad、方向键、轨迹球等导航硬件较新的 Android 版本也支持蓝牙或 USB 外接键盘。要让这些输入方式可用所有可用于导航的元素都必须设置为可聚焦focusable。使元素可聚焦focusable 属性与 setFocusable()设置聚焦有两种途径XML 布局使用android:focusable属性代码调用View.setFocusable()方法。例如让一个按钮和一段文本都可聚焦Button android:idid/doSomething android:focusabletrue android:nextFocusDownid/label ... / TextView android:idid/label android:focusabletrue android:textstring/labelText android:nextFocusUpid/doSomething ... /补充说明由 Android 框架提供的标准交互组件如 Button、EditText默认就是可聚焦的用户可以用 D-pad 或键盘选中它们组件会发光或改变外观以示选中。自定义的非交互性 View 则需要显式设置详见 支持键盘导航 一课的测试说明。指定焦点移动方向nextFocus* 系列属性每个 UI 控件有四个与方向导航相关的属性android:nextFocusUpandroid:nextFocusDownandroid:nextFocusLeftandroid:nextFocusRight用户在导航时系统会利用这些属性决定下一个焦点落到哪里。默认情况下系统会根据布局的方向自动确定导航顺序如果自动方案在某个界面不合用就可以用这四个属性手动修正。上面的例子中按向下键会将焦点从按钮doSomething移到文本label按向上键则重新将焦点移回按钮形成一条可逆的上下导航链路。补充Tab 键导航与 nextFocusForward除了方向键键盘用户的 Tab 键是另一条重要的导航路径。系统默认按组件在布局中的显示顺序传递 Tab 焦点但当使用 RelativeLayout 等布局时屏幕上的组件顺序可能与布局文件中的声明顺序不一致此时需要借助android:nextFocusForward属性显式定义 Tab 焦点顺序详见 支持键盘导航其中给出了 Button/EditText 之间显式指定 forward 链路的完整示例。对无障碍而言方向导航与 Tab 导航应一并设计。用模拟器验证导航验证应用焦点导航是否正确的直观方法是在 Android 模拟器AVM中运行应用使用模拟器提供的方向键在各个元素之间移动焦点并用 OK 键代替触摸操作。仓库中 支持键盘导航 一课还给出了更完整的建议在 AVD 管理器中确保Keyboard与D-pad选项开启然后分别只用 Tab 键、只用方向键完整走一遍 UI记录任何焦点不符合预期的实例并修正。触发可达性事件让自定义 View 主动广播状态如果你使用 Android 框架提供的 View 组件那么当 View 被选中或焦点变化时系统会自动产生可达性事件AccessibilityEvent。这些事件会被传递到 Accessibility Service 中处理进而实现语音提示等辅助功能——这正是前文 TalkBack 能够自动朗读的底层机制。自定义 View 的责任如果你编写了自定义 View就必须确保它在合适的时机主动产生事件。使用sendAccessibilityEvent(int)方法可以产生可达性事件其中参数表示事件的类型。完整的事件类型可查阅AccessibilityEvent类的参考文档常见类型包括TYPE_VIEW_CLICKED、TYPE_VIEW_FOCUSED、TYPE_VIEW_TEXT_CHANGED等。例如你扩展了一个图片 View希望在它获得焦点时用户能用键盘打字在图片中插入题注。此时发送一个TYPE_VIEW_TEXT_CHANGED事件就很合适——尽管这个事件类型并非该图片 View 本身自带的。产生事件的代码如下public void onTextChanged(String before, String after) { ... if (AccessibilityManager.getInstance(mContext).isEnabled()) { sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED); } ... }这段代码有几个值得注意的工程细节先检查再发送通过AccessibilityManager.getInstance(mContext).isEnabled()判断当前是否有启用的 Accessibility Service避免在没有监听者时做无意义的广播开销事件语义要与动作匹配TYPE_VIEW_TEXT_CHANGED表示文本内容发生变化让辅助服务能准确播报内容更新了。仓库中 创建自定义 View 一课的清单同样强调在适当的时候通过调用sendAccessibilityEvent()发送访问事件与本课的要求互为印证。事件如何被消费Accessibility Service 侧视角要理解这些事件的价值可以对照同目录下的 开发辅助服务 一课Accessibility Service 通过onAccessibilityEvent(AccessibilityEvent event)接收事件用getEventType()判断事件类型、用getContentDescription()提取产生事件的 View 的文本标签再通过 TTS 引擎等反馈机制向用户播报。也就是说本课让应用正确发出事件辅助服务负责接收并反馈二者构成完整的无障碍链路。测试时若发现自定义 View 的语音反馈缺失优先检查是否漏发了对应类型的事件。测试你的程序用真实辅助工具验证改造效果添加可达性功能后务必测试其有效性。测试聚焦两个层面内容描述与可达性事件是否被正确播报以及纯键盘/方向键导航是否流畅。用 TalkBack 验证语音反馈为测试内容描述与可达性事件请安装并启用一个 Accessibility Service。TalkBack 是一个免费、开源的屏幕阅读软件可在 Google Play 下载。Service 启动后逐一测试应用中所有功能同时聆听 TalkBack 的语音反馈确认每个有语义的控件是否被正确朗读静态contentDescription与动态setContentDescription()的文案是否符合预期焦点切换、点击、文本变化等操作是否触发了对应的语音提示验证自定义 View 的事件发送。用方向控制器验证导航同时尝试用方向控制器而非直接触摸操作你的应用。可以使用物理设备如十字键、轨迹球没有条件时Android 模拟器提供了虚拟的按键控制同样能模拟方向键与 OK 键。结合 支持键盘导航 的测试方法还可补充两类验证只用 Tab 键遍历整个 UI确认焦点顺序与屏幕呈现顺序一致必要时用nextFocusForward修正只用方向键逐元素移动焦点确认上下左右的行为符合预期必要时用nextFocus*系列修正。以无视觉视角审视应用在测试导航与语音反馈的同时应当对应用在没有任何视觉提示的情况下大致是什么样子有所认识——想象你只能依赖语音和按键定位界面是否依然可用、信息是否完整、操作路径是否顺畅。发现的问题就修复、优化最终就能开发出一个更易用、可达的 Android 程序。总结与延伸阅读让应用具备可达性并不是一次性的任务而是贯穿开发、测试的持续实践。本文覆盖的四个步骤——内容描述、焦点导航、可达性事件与测试——构成了应用侧无障碍改造的完整闭环。想进一步深入可以在本仓库中继续阅读实现辅助功能可达性课程的目录总览了解应用优化与辅助服务两大方向开发辅助服务从 Service 侧理解事件如何被监听与反馈包括AccessibilityService的创建、XML 配置accessibilityEventTypes、feedbackType、canRetrieveWindowContent等以及用AccessibilityNodeInfo遍历 View 层级提取信息支持键盘导航Tab 键与方向键导航的系统行为、测试方法及nextFocusForward的补充用法创建自定义 View自定义视图场景下内容描述与可达性事件的落点清单。无障碍改造不仅惠及少数有特殊需求的用户也会让应用对更多输入设备、更多使用场景如车载、大屏、外接键盘更加友好——这是 Android 应用走向更广泛用户群体的必修课。赞分享文档教程移动开发【免费下载链接】android-training-course-in-chineseAndroid官方培训课程中文版项目地址https://gitcode.com/gh_mirrors/an/android-training-course-in-chinese点击查看免费下载相关推荐Android官方培训课程中文版教程Android官方培训课程中文版教程 1. 项目介绍 Android官方培训课程中文版Android Training Course in Chinese是文档教程移动开发Android官方培训课程中文版实现高效的向后导航Back Navigation完整实战指南Android官方培训课程中文版实现高效的向后导航Back Navigation完整实战指南 本篇技术指南围绕 Android 官方培训课程中提供适当的文档教程移动开发Android TV 应用入门全指南从开发环境搭建到布局导航实战Android官方培训课程中文版Android TV 应用入门全指南从开发环境搭建到布局导航实战Android官方培训课程中文版 本篇技术指南基于《Android官方培训课程中文版》仓库文档教程移动开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考