2014-09-03 5 views
6

Per impostazione predefinita, il servizi di accessibilità leggerà quanto segue per una vista EditTextAndroid Acccessibility: Come faccio a modificare il testo letto ad alta voce per un EditText View

  • Se l'EditText ha un valore inserito = lo farà leggere tale valore
  • Se non c'è valore immesso = si leggerà il "suggerimento"

voglio che leggere qualcosa di completamente diverso nei due casi.

mio XML frammento è

<EditText 
    android:id="@+id/my_edit_text" 
    android:layout_height="wrap_content" 
    android:layout_width="0dp" 
    android:layout_weight="1" 
    android:editable="false" 
    android:focusable="true" 
    android:hint="my hint text"/> 

devo sostenere API 14 in poi.

Non voglio passare al problema di estendere EditText per questo singolo caso, quindi sto utilizzando AccessibilityDelegate.

mEditTextView.setAccessibilityDelegate(accessibilityDelegate); 

Dalla documentazione che ho capire che in un mio delegato Ho solo per sovrascrivere i metodi il delegato per il quale vorrei modificare il comportamento. Tutti gli altri metodi saranno predefiniti per l'implementazione della vista.

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

Il doc per "onPopulateAccessibilityEvent" dice: "dà la possibilità di ospita Visualizza per popolare l'evento di accessibilità con il suo contenuto di testo" Il doc per "dispatchPopulateAccessibilityEvent" dice: " Invia un AccessibilityEvent all'host Visualizza prima e poi ai suoi figli per aggiungere il loro contenuto di testo all'evento. "e che il comportamento predefinito è chiamare" onPopulateAccessibilityEvent "per la vista stessa e quindi" dispatchPopulateAccessibilityEvent "su tutti i suoi figli

http://developer.android.com/guide/topics/ui/accessibility/apps.html

Questo documento dice sotto "onPopulateAccessibilityEvent" "* Se l'implementazione di questo evento sostituisce completamente il testo in uscita senza che altre parti del layout di modificarne il contenuto, allora non chiamare il super attuazione del presente metodo nel tuo codice. "

Perciò il mio delegato è il seguente

View.AccessibilityDelegate accessibilityDelegate = new View.AccessibilityDelegate() { 
    @Override 
    public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) { 
     event.getText().add("Apples"); 
    } 

}; 

Perché quando uso la tastiera per navigare o per utilizzare lo schermo per toccare l'EditText vista è ancora leggendo "il mio suggerimento di testo" e non "Mele" ?

Se utilizzo un debugger, vedo che prima di impostare il testo dell'evento, il testo è vuoto e dopo averlo impostato, è "Mele", ma il TalkBack legge ancora il suggerimento.


Stranamente se sovrascrivere "onInitializeAccessibilityNodeInfo" e inviare un evento con il mio testo desiderato, allora questo testo desiderato viene letta (vedi frammento di codice di seguito). Ma questo mi sembra sbagliato visto che "onInitializeAccessibilityNodeInfo" sta reagendo all'evento di EditText ma poi ne sta appena aumentando uno nuovo.

@Override 
public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfo info){ 
    super.onInitializeAccessibilityNodeInfo(v, info);  
    ... 
    final AccessibilityEvent event = AccessibilityEvent.obtain(eventType); 
    event.getText().add("Pears"); 
    event.setClassName(className); 
    event.setPackageName(packageName); 
    ...  
    v.getParent().requestSendAccessibilityEvent(v, event); 
} 

risposta

0

possiamo cambiare il testo letto ad alta voce di vista EditText effettuando le seguenti operazioni:

View.AccessibilityDelegate accessibilityDelegate = new View.AccessibilityDelegate() { 
    @Override 
    public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfo info) { 
     super.onInitializeAccessibilityNodeInfo(v, info); 
     info.setText("some customized text") 
    } 
}; 

e quindi impostare questo delegato sulla vista EditText.

Problemi correlati