宣布一个带有 Talkback 的 TextView

Posted

技术标签:

【中文标题】宣布一个带有 Talkback 的 TextView【英文标题】:Announce a TextView with Talkback 【发布时间】:2018-04-21 01:44:54 【问题描述】:

我正在使用 google maps api 开发一个应用程序,并且假设它是供看不见的人使用的,因此可访问性很重要。

如何使 TextView 已经作为文本和 contentDescription 在活动开始后立即公布,而无需用户触摸它?

我的问题的另一点是我有一条公交路线,我想在某些点收到带有描述的通知,我的问题是对讲工作正常,但是如果我触摸 googlemap 或那里的其他任何地方活动,对讲停止说出描述。 (此描述显示在 Toast 中)

【问题讨论】:

【参考方案1】:

您在第一点中概述的关于在您的活动星号后立即阅读文本的内容是不受欢迎的行为。让 TalkBack 用户浏览您的应用以查找此信息。如果您必须发布公告,您正在寻找的是 Accessibility Announcement 事件,它允许您向辅助技术层发送任意文本公告。

if (AccessibilityManager.getInstance(context).isEnabled()) 
    AccessibilityEvent event = AccessibilityEvent.obtain(
                AccessibilityEvent.TYPE_ANNOUNCEMENT);
    onInitializeAccessibilityEvent(event);
    event.getText().add("some text");
    event.setContentDescription(null);
    yourContentView.requestSendAccessibilityEvent(this, event);

您在第二点中概述的是期望的行为。想象一下,如果 TalkBack 用户不能打断各种公告,如果他们不小心连续聚焦了几段文本,他们可能需要等待多长时间才能听到按钮之类的简单名称?这将是一个非常令人沮丧的用户体验。

【讨论】:

谢谢,我想这对我来说已经足够了!谢谢! @ChrisCM【参考方案2】:

与上述相同的答案,最新的代码更新:

private void sendAccessibiltyEvent(@NonNull String message) 
    AccessibilityManager accessibilityManager = (AccessibilityManager)requireActivity().getApplicationContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
    if (accessibilityManager.isEnabled()) 
        AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_ANNOUNCEMENT);
        event.getText().add(message);
        accessibilityManager.sendAccessibilityEvent(event);
    

【讨论】:

以上是关于宣布一个带有 Talkback 的 TextView的主要内容,如果未能解决你的问题,请参考以下文章

TalkBack 可访问性 StaggeredGridLayoutManager 焦点顺序错误

TalkBack 是啥东西?能删吗?

Android 如何在阅读列表项计数时停止包含页脚行的 TalkBack

Android TalkBack 和片段堆栈

程序清单4.1_talkback.c程序_《C Primer Plus》P60

如何覆盖辅助功能类名称