RecyclerView
在使用新数据集重新加载 a 的项目后,我需要宣布按钮何时可见。RecyclerView
作为一个框架视图,它支持开箱即用的对讲/可访问性。加载新数据后,对讲会自动宣布“显示项目 x 到 y 的 z”。利用 TTS API 解决我提到的用例会引入以下陷阱:
- TTS 实例初始化和管理繁琐且值得商榷,原因如下:
- 使用 onInit 监听器管理 TTS 实例生命周期
- 管理区域设置
shutdown()
通过将您与Activity
每个文档的生命周期联系起来管理资源
- 不能保证调用 Activity 的 onDestroy,这似乎是一种糟糕的调用机制
shutdown()
以释放 TTS 资源。
一个更简单、更易于维护的解决方案是很好地使用 TalkBack 并使用 Accessibility API,如下所示:
class AccessibilityHelper {
companion object {
@JvmStatic
fun announceForAccessibility(context: Context, announcement: String) {
context
.getSystemService(ACCESSIBILITY_SERVICE)
.let { it as AccessibilityManager }
.let { manager ->
AccessibilityEvent
.obtain()
.apply {
eventType = TYPE_ANNOUNCEMENT
className = context.javaClass.name
packageName = context.packageName
text.add(announcement)
}
.let {
manager.sendAccessibilityEvent(it)
}
}
}
}
}
从您需要的任何地方调用上述内容(我在我的基础活动中添加了一个方法,该方法转发给了助手)。这会将公告插入到消息队列中,以便 TalkBack 大声宣布,并且不需要处理 TTS 实例。我最终在我的最终实现中添加了延迟参数和机制,以将这些事件与正在进行的 ui 触发事件分开,因为它们有时会覆盖手动通知。