首页 文章

Android - 将TalkBack可访问性焦点设置为特定视图

提问于
浏览
17

启用TalkBack时,有没有办法将辅助功能焦点手动设置为特定视图?例如,当我的Activity启动时,我希望TalkBack自动关注某个Button(视图周围的黄色框)并阅读其内容描述 .

到目前为止我尝试过的:

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);
    }

这似乎都不起作用 .

1 回答

  • 26

    免责声明:强制将活动负载集中在任何地方,但最重要的是总是(好吧,几乎永远不应该说),但实际上,就是不要这样做 . 它违反了各种WCAG 2.0法规,包括3.2.1和3.2.3,分别涉及可预测的导航和上下文变更 . 实际上,您可能实际上使您的应用程序更难以访问 .

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

    免责声明 .

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

    myButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
    

    问题更可能是您尝试这样做的时间点 . 对话会在活动周期的稍后阶段将您的活动与自己的活动联系起来 . 以下解决方案说明了这个问题,老实说,我不确定有更好的方法可以做到这一点 . 我试过onPostResume,这是Android操作系统调用的最后一个回调,关于加载活动,但我仍然需要添加延迟 .

    @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);
    
    }
    

    您可以创建自定义视图 . 视图中的回调可以提供您执行此操作所需的逻辑,而不会出现竞争条件!如果我有时间,我可能会在以后更深入地研究它 .

相关问题