Android辅助功能:如何更改为EditText视图大声读出的文本

时间:2014-09-03 09:42:41

标签: android android-edittext talkback

默认情况下,Accessibility Services将为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

on&#34; onPopulateAccessibilityEvent&#34;说:&#34; 使主机View有机会用其文本内容填充辅助功能事件。&#34; &#34; dispatchPopulateAccessibilityEvent&#34;说:&#34; 首先向主机View调度AccessibilityEvent,然后向其子节点调度,以便将其文本内容添加到事件中。&#34;并且默认行为是调用&#34; onPopulateAccessibilityEvent&#34;对于视图本身然后&#34; dispatchPopulateAccessibilityEvent&#34;在所有的孩子身上

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

此文档在&#34; onPopulateAccessibilityEvent&#34; &#34; *如果此事件的实现完全覆盖输出文本而不允许布局的其他部分修改其内容,则不要在代码中调用此方法的超级实现。&#34;

因此我的代表是以下

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

};

为什么当我使用键盘导航或使用屏幕点击EditText视图时,它仍在阅读&#34;我的提示文字&#34;而不是&#34;苹果&#34;?

如果我使用调试器,我看到在设置事件文本之前,文本为空,在我设置之后,它是&#34; Apples&#34;然而,TalkBack仍然会读出提示。


奇怪的是,如果我覆盖&#34; onInitializeAccessibilityNodeInfo&#34;并使用我想要的文本发送一个事件,然后读出所需的文本(参见下面的代码片段)。但这对我来说似乎是错误的,因为&#34; onInitializeAccessibilityNodeInfo&#34;正在对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);  
}

2 个答案:

答案 0 :(得分:1)

这听起来与我之前遇到的问题非常相似:Android: How to eliminate spoken text from AccessibilityEvents when extending SeekBar?

您是否尝试过(作为测试)清除onPopulateAccessibilityEvent中的提示文字,而不仅仅是添加“苹果”文字?我似乎记得我的实证结果与Android文档不匹配,特别是对于API 14之前的Android OS。

答案 1 :(得分:1)

我们可以通过执行以下操作来更改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视图。