Android - Set TalkBack accessibility focus to a specific view

前端 未结 4 999
天命终不由人
天命终不由人 2020-12-14 16:10

When TalkBack is enabled, is there any way to set the accessibility focus manual to a specific view? For instance, when my Activity is started I want TalkBack to automatical

4条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-14 16:26

    DISCLAIMER: Forcing focus on Activity load to be anywhere but at the top bar is always (okay, always should almost never be said), but really, just don't do it. It is a violation of all sorts of WCAG 2.0 regulations, including 3.2.1 and 3.2.3, regarding predictable navigation and context changes respectively. You are, likely, actually making your app MORE inaccessible by doing this.

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

    END DISCLAIMER.

    You are using the correct function calls. All you should need to do is this:

    myButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
    

    The problem is more likely the point at which your attempting to do this. Talkback attaches itself to your activity slightly later in the activity cycle. The following solution illustrates this problem, I'm not sure there is a better way to do this, to be honest. I tried onPostResume, which is the last callback the Android OS calls, regarding the loading of activities, and still I had to add in a delay.

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

    You might be able to create a custom view. The callbacks within view, may provide the logic you need to do this, without the race condition! I might look into it more later if I get time.

提交回复
热议问题