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