2013-03-30 4 views
10

Sto sviluppando un'applicazione Android accessibile in cui le persone utilizzano i servizi di accessibilità Explore by Touch e TalkBack per utilizzare la mia applicazione.Android - impedisce a TalkBack di annunciare ad alta voce il titolo di TextView

Questo è il mio codice XML Android:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/LinearLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <TextView 
     android:id="@+id/forename" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="20dip" 
     android:layout_marginLeft="15dip" 
     android:textSize="20sp" 
     android:text="@string/forenameText" 
     android:contentDescription="@null"/> 

    <EditText 
     android:id="@+id/EditTextForename" 
     android:layout_width="285dp" 
     android:layout_height="65dp" 
     android:layout_marginTop="10dip" 
     android:layout_marginLeft="15dip" 
     android:hint="@string/forenameHint" 
     android:inputType="textPersonName" 
     android:lines="1" 
     android:singleLine="true" 
     android:textSize="20sp" > 
    </EditText> 

</LinearLayout> 

strings.xml

<string name="forenameText">Forename</string> 
<string name="forenameHint">Enter your forename here</string> 

TextView visualizza il titolo "Forename" e EditText mi permette di inserire alcuni dettagli nel campo del modulo. Il problema che ho è che quando I trascina il dito sullo schermo usando Esplora al tocco, TalkBack prende il titolo del TextView e lo annuncia ad alta voce come "Nome". Voglio che TextView visualizzi solo il testo e non fornisca alcun feedback udibile.

Ho impostato contentDescription su @null come si può vedere dal codice sopra, ma TalkBack annuncia ancora "Nome" quando il mio dito si trova sopra il TextView .

Inoltre ho provato a fissare contentDescription nella mia classe Java:

TextView forename=(TextView)findViewById(R.id.forename); 
forename.setContentDescription(""); 

Tuttavia, ho ancora lo stesso problema. C'è un altro modo per impostare contentDescription su null/empty e impedire a TalkBack di annunciarlo ad alta voce?

codice Java:

public class MainActivity extends Activity{ 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     View forename = findViewById(R.id.forename); 

     forename.setAccessibilityDelegate(new AccessibilityDelegate() { 
      public boolean performAccessibilityAction (View host, int action, Bundle args){ 
      return true; 
      } 
     }); 
    } 

} 

risposta

12

stavo cercando di fare lo stesso oggi, ed è stato in grado di impostare un 'empty' contentDescription su un TextView in questo modo (con uno spazio bianco non rottura):

decorativeTextView.setContentDescription("\u00A0"); 

ora TalkBack non dice nulla per che TextView.

ma sono d'accordo con Nick sul lasciare l'etichetta leggibile nel tuo caso, perché il suggerimento è letto solo per vuoto EditTexts.

+0

Questo ha risolto il problema. Grazie mille per il vostro aiuto! Si prega di vedere il mio commento sotto il post di Nick. Ho un altro problema che sto cercando di risolvere ora. – Alex

+0

ri. quel nuovo problema nel tuo commento: non ottengo quel comportamento con il tuo layout pubblicato originariamente, con alcune coppie di TextView-EditText duplicate da testare. vedi la finestra di messa a fuoco sull'accessibilità attorno a un singolo campo di testo che stai toccando quando questo accade? Ho scoperto che se il contenitore (ad esempio LinearLayout) ottiene accessibilityfocus invece (la yellowbox), i bambini di sola lettura dovrebbero essere letti e non vengono considerati come "tangibili" singolarmente - quindi potresti pensare di aver toccato il campo di testo , ma l'evento (e il focus) sono passati a genitore ... – salfon

+0

La mia "risposta" menziona gli aggiornamenti specifici dell'API, questa soluzione funziona anche per le versioni precedenti di Android! Grazie! – Matt

2

ho avuto un problema simile. Alla fine l'ho risolto usando il metodo setAccessibilityDelegate e sovrascrivendo il metodo View.AccessibilityDelegate'sperformAccessibilityAction.

provare questo:

View forename = findViewById(R.id.forename); 

forename.setAccessibilityDelegate(new AccessibilityDelegate() { 
    public boolean performAccessibilityAction (View host, int action, Bundle args){ 
    return true; 
    } 
}); 
+0

Grazie per la risposta, mmaloon. Ho applicato la tua soluzione al mio programma ma sfortunatamente TalkBack annuncia ancora "nome" ad alta voce. Ho aggiornato il mio post originale con il codice Java che attualmente ho. La mia soluzione attuale è usare ImageViews invece di TextViews poiché per impostazione predefinita non forniscono alcun feedback udibile. – Alex

+0

Ho anche un'altra domanda riguardante il mio campo di testo EditText. Ho un attributo "hint" lì che legge una stringa chiamata "forenameHint". Quella stringa contiene il seguente testo: "Inserisci il tuo nome qui". Quando utilizzo Esplora al tocco e trascino il dito sul campo modulo, TalkBack annuncia "EditBox Inserisci il tuo nome qui". C'è un modo per impedirgli di annunciare "EditBox" prima di ogni stringa nell'attributo hint? O magari cambiarlo in qualcosa di più user friendly come "Campo modulo: inserisci il tuo nome qui"? Grazie in anticipo – Alex

0

Ho avuto lo stesso problema, e l'unica cosa che ha funzionato per me era android:contentDescription=" " (spazio bianco).

+0

Impostazione del contenutoDescrizione allo spazio bianco usato per lavorare anche per me in passato. Alcune settimane fa TalkBack aveva rilasciato un nuovo aggiornamento al loro software e dopo che lo screen reader ha iniziato ad annunciare ad alta voce la stringa "text" del mio TextView, indipendentemente dal fatto che contentDescription fosse impostato su bianco o nullo. Sono certo che c'è un modo per risolvere il problema utilizzando servizi avanzati di accessibilità come suggerito da mmaloon, ma non ho ancora le conoscenze per implementarli. – Alex

2

Perché non vuoi che il TextView parli di "nome"? Viene utilizzato come etichetta per EditText. Una volta che l'utente ha inserito del testo, il suggerimento "inserisci il tuo nome qui" non sarà più pronunciato, per quanto ne so, quindi il TextView ha dato all'utente un contesto per EditText.

Analogamente, l'annuncio di "editbox" fornisce all'utente il ruolo del controllo EditText. Mentre "campo modulo" potrebbe essere migliore, non sarebbe lo stesso comportamento di altre app e del sistema operativo.

+1

Questo è un buon punto. La ragione per cui non desidero che TextView fornisca alcun feedback udibile è perché ho più di un campo TextViews e EditText nell'applicazione. Il problema che ho è che quando indico una delle TextViews, TalkBack annuncia tutte le TextViews ad alta voce. Quindi, anche se indico il TextView che si trova nella parte inferiore dello schermo, TalkBack annuncia tutte le TextView una alla volta. Devo ancora capire che cosa causa questo problema. – Alex

+0

Cosa intendi con "punta a TextView"? –

+0

scusate volevo dire quando trascino il dito su una particolare TextView sullo schermo, tutte le TextView sono annunciate ad alta voce una ad una dallo screen reader. – Alex

14

Da API 16, Android introdotti:

android:importantForAccessibility="no" 

o

setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO) 

che consente agli sviluppatori di disattivare talkback tutti insieme per alcune viste.

http://developer.android.com/reference/android/view/View.html

+3

E con la revisione 22 è ora nella libreria di supporto v4. http://developer.android.com/tools/support-library/index.html – Herrbert74

16

Per una migliore compatibilità all'indietro:

ViewCompat.setImportantForAccessibility(
     decorativeTextView, 
     ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO); 
Problemi correlati