2015-02-12 13 views
13

Quando TalkBack è abilitato, esiste un modo per impostare il manuale di messa a fuoco per accessibilità su una vista specifica? Ad esempio, quando viene avviata la mia attività, voglio che TalkBack si concentri automaticamente su un determinato pulsante (riquadro giallo attorno alla vista) e legga la sua descrizione del contenuto.Android: imposta lo stato attivo di accessibilità TalkBack a una vista specifica

Quello che ho provato finora:

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

requestFocus(), a quanto pare, è che richiede solo attivo per l'input e non ha nulla a che fare con il fuoco accessibilità. Ho anche provato:

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

Nulla di tutto ciò sembra funzionare.

+0

"All'avvio del talkback". Vuoi dire come in, quando talkback è attivo sulla mia vista. Oppure, quando qualcuno attiva il talkback mentre la tua vista è attiva? – ChrisCM

+0

Né. Se TalkBack è abilitato nelle Impostazioni e viene avviata un'attività della mia app, voglio che l'accessibilità si concentri su un determinato pulsante all'interno della mia attività – Skywalker10

+0

Ah, okay, quindi quando l'attività si carica, vorresti controllare quale elemento è inizialmente focalizzato da talkback (Android "focus" che significa qualcosa di diverso dal focus del talkback). Solo per scopi di accessibilità. – ChrisCM

risposta

19

ESCLUSIONE DI RESPONSABILITÀ: forzare l'attenzione sul carico di attività per essere ovunque ma nella barra superiore è sempre (va bene, non dovrebbe quasi mai essere detto), ma in realtà, non farlo. Si tratta di una violazione di tutti i tipi di regolamenti WCAG 2.0, compresi 3.2.1 e 3.2.3, relativi rispettivamente alla navigazione prevedibile e ai cambiamenti di contesto. In questo modo, probabilmente stai rendendo la tua app PIÙ inaccessibile.

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

FINE disclaimer.

Si stanno utilizzando le chiamate di funzione corrette. Tutto quello che dovrebbe essere necessario fare è questo:

myButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); 

il problema è più probabile che il punto in cui il tentativo di fare questo. Talkback si attacca alla tua attività poco dopo nel ciclo di attività. La seguente soluzione illustra questo problema, non sono sicuro che ci sia un modo migliore per farlo, per essere onesti. Ho provato su PostResume, che è l'ultima callback chiamata dal SO Android, per quanto riguarda il caricamento delle attività, e ho dovuto aggiungere un ritardo.

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

} 

Potrebbe essere possibile creare una vista personalizzata. I callback in vista possono fornire la logica necessaria per farlo, senza le condizioni della gara! Potrei esaminarlo più tardi se avrò tempo.

+0

Grazie. Sarebbe una pratica migliore aggiungere una preferenza all'interno della mia app chiedendo all'utente se mettere a fuoco questo pulsante? Pertanto, verrà utilizzato il comportamento TalkBack predefinito, a meno che l'utente non imposti esplicitamente questa preferenza. – Skywalker10

+0

Quello che mi piace fare nelle app è assicurarsi che i miei pulsanti abbiano dimensioni ragionevoli, in particolare la larghezza. Se un pulsante è abbastanza largo, gli utenti non vedenti dovrebbero essere in grado di trovarlo usando l'esplorazione del tocco, invece di dover sfogliare # volte. I pulsanti ragionevolmente larghi al centro dello schermo sono facili da trovare usando i movimenti di trascinamento dito! Questa è la migliore combinazione di non violare le linee guida WCag coerenti di navigazione/cambiamento del contesto e la massima esperienza utente non a vista. – ChrisCM

+2

Anche se questo approccio potrebbe funzionare per la versione corrente di TalkBack, la raccomandazione che forniamo è ** mai ** tentare di posizionare manualmente l'accessibilità da un'app. Finirai per litigare con TalkBack o con l'utente, nessuna delle due fornirà una buona esperienza. – alanv