Android可访问性:如何更改为EditText视图大声读出的文本

se2*_*2as 6 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"/>
Run Code Online (Sandbox Code Playgroud)

我必须支持API 14及更高版本.

我不想为这一个案例扩展EditText,因此我使用的是AccessibilityDelegate.

mEditTextView.setAccessibilityDelegate(accessibilityDelegate);
Run Code Online (Sandbox Code Playgroud)

从文档中我了解到,在我的委托中,我只需要在委托中覆盖我想要改变行为的那些方法.所有其他方法将默认为View的实现.

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

"onPopulateAccessibilityEvent"的文档说:" 给主机View一个机会用它的文本内容填充辅助功能事件. ""dispatchPopulateAccessibilityEvent"的文档说:" 首先向主机View调度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");
    }

};
Run Code Online (Sandbox Code Playgroud)

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

如果我使用调试器,我看到在设置事件文本之前,文本为空,在我设置之后,它是"Apples"但是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);  
}
Run Code Online (Sandbox Code Playgroud)

Awa*_*eam 1

这听起来与我之前遇到的问题非常相似:Android: How to消除语音文本从AccessibilityEvents扩展SeekBar时?

您是否尝试过(作为测试)清除 中的提示文本onPopulateAccessibilityEvent,而不是仅添加“Apples”文本?我似乎记得我的经验结果与 Android 文档不符,特别是对于 API 14 之前的 Android 操作系统。