Android - 将 TalkBack 辅助功能焦点设置到特定 View

标签 android accessibility talkback

启用 TalkBack 后,是否可以将辅助功能焦点手册设置为特定 View ?例如,当我的 Activity 启动时,我希望 TalkBack 自动关注某个 Button( View 周围的黄框)并阅读其内容描述。

到目前为止我已经尝试过:

    myButton.setFocusable(true);
    myButton.setFocusableInTouchMode(true);
    myButton.requestFocus();

requestFocus() 似乎只是请求输入焦点,与可访问性焦点无关。我也试过:

    myButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
    myButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
    myButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
    myButton.announceForAccessibility("accessibility test");
    myButton.performAccessibilityAction(64, null); // Equivalent to ACTION_ACCESSIBILITY_FOCUS

    AccessibilityManager manager = (AccessibilityManager) getSystemService(Context.ACCESSIBILITY_SERVICE);
    if (manager.isEnabled()) {
        AccessibilityEvent e = AccessibilityEvent.obtain();
        e.setSource(myButton);
        e.setEventType(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
        e.setClassName(getClass().getName());
        e.setPackageName(getPackageName());
        e.getText().add("another accessibility test");
        manager.sendAccessibilityEvent(e);
    }

这些似乎都不起作用。

最佳答案

免责声明:强制将 Activity 加载的焦点放在任何地方,但始终位于顶部栏(好吧,几乎永远不应该说),但实际上,只是不要这样做。它违反了 WCAG 2.0 的各种规定,包括 3.2.1 和 3.2.3,分别关于可预测的导航和上下文变化。通过这样做,您实际上可能会使您的应用更难以访问。

http://www.w3.org/TR/WCAG20/#consistent-behavior

结束免责声明。

您正在使用正确的函数调用。您需要做的就是:

myButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);

问题更可能是您尝试执行此操作的点。对讲会在 Activity 周期稍晚一点的时候附加到您的 Activity 中。以下解决方案说明了这个问题,老实说,我不确定是否有更好的方法来做到这一点。我尝试了 onPostResume,这是 Android 操作系统调用的最后一个回调,关于加载 Activity ,但我仍然不得不添加延迟。

@Override
protected void onPostResume() {
    super.onPostResume();

    Log.wtf(this.getClass().getSimpleName(), "onPostResume");

    Runnable task = new Runnable() {

        @Override
        public void run() {
            Button theButton = (Button)WelcomeScreen.this.findViewById(R.id.idButton);
            theButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
        }
    };

    final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor();

    worker.schedule(task, 5, TimeUnit.SECONDS);

}

您也许可以创建自定义 View 。 View 中的回调可能会提供您需要执行此操作的逻辑,而无需竞争条件!如果有时间,我可能会再研究一下。

关于Android - 将 TalkBack 辅助功能焦点设置到特定 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28472985/

相关文章:

html - 关于文本/链接颜色差异存在哪些(如果有)准则?

iphone - 如何押注通过 VoiceOver 访问 View ?

android - 如何在 ConstraintLayout 中创建可访问的焦点小组?

android - 关于 Android 辅助功能反馈。有没有对讲焦点听众?

Android TalkBack 重复说 "Service [my app name]"

android - 如何正确地从 Firebase 实时数据库中检索值?

android - 如何在 ScrollView 中添加两个 ListView

css - 浏览器覆盖时未设置输入文本颜色

java.lang.IndexOutOfBoundsException : Index: 0, 大小 : 0?

android - 通过 http REST 和 EJB3 连接两个 android 应用程序