默認情況下,輔助服務將讀出一個EditText視圖的Android Acccessibility:如何更改文本朗讀了一個EditText查看
- 以下如果EditText上已經進入價值=它會讀出該值
- 如果沒有進入=它會讀出「提示」
我希望它讀出來的東西在這兩種情況下完全不同的價值。
我的XML片斷是
<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"/>
我要支持API 14日起實施。
我不想爲這個單個案例擴展EditText的麻煩,因此我使用的是AccessibilityDelegate。
mEditTextView.setAccessibilityDelegate(accessibilityDelegate);
從我明白,在我委託我只覆蓋在委託這些方法,我想改變行爲的文檔。所有其他方法將默認爲View的實現。
http://developer.android.com/reference/android/view/View.AccessibilityDelegate.html http://developer.android.com/reference/android/view/View.html
爲「onPopulateAccessibilityEvent」該醫生說:「有一定機率給主機查看其文本內容來填充無障礙事件」 爲「dispatchPopulateAccessibilityEvent」該醫生說:「 將AccessibilityEvent分派給主機查看第一個視圖,然後查看其子項以將其文本內容添加到事件「,並且默認行爲是爲視圖本身調用」onPopulateAccessibilityEvent「,然後對其所有子項調用」dispatchPopulateAccessibilityEvent「
http://developer.android.com/guide/topics/ui/accessibility/apps.html
該文檔在「onPopulateAccessibilityEvent」「*說,如果您對本活動的實施完全覆蓋輸出文本,而不允許你的佈局的其他部分修改其內容,那就不叫超執行本方法在你的代碼中。「
因此,我代表的是以下
View.AccessibilityDelegate accessibilityDelegate = new View.AccessibilityDelegate() {
@Override
public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) {
event.getText().add("Apples");
}
};
爲什麼當我使用鍵盤來瀏覽或使用屏幕輕觸的EditText查看它仍然在讀「我的提示文本」,而不是「蘋果」 ?
如果我使用調試器,我發現在設置事件文本之前,文本是空的,設置後它是「蘋果」,但TalkBack仍然讀出提示。
古怪,如果我重寫「onInitializeAccessibilityNodeInfo」,並與我期望的文本,那麼這個期望的文本被讀出(見下面的代碼片段)發送事件。但是這對我來說似乎是錯誤的,因爲「onInitializeAccessibilityNodeInfo」對EditText的事件作出了反應,但隨後只是提出了一個新事件。
@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);
}