2014-09-03 41 views
6

默認情況下,輔助服務將讀出一個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); 
} 

回答

0

我們可以改變文本朗讀的EditText視圖通過執行以下操作:

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

,然後將此代理設置爲EditText視圖。

相關問題