- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
默认情况下,辅助功能服务将为 EditText View 读出以下内容
我希望它在两种情况下读出完全不同的内容。
我的 xml fragment 是
<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);
从文档中我了解到,在我的委托(delegate)中,我只需要覆盖委托(delegate)中我想更改其行为的那些方法。所有其他方法将默认为 View 的实现。
http://developer.android.com/reference/android/view/View.AccessibilityDelegate.html http://developer.android.com/reference/android/view/View.html
“onPopulateAccessibilityEvent”的文档说:“让宿主视图有机会用其文本内容填充可访问性事件。”“dispatchPopulateAccessibilityEvent”的文档说:“首先将 AccessibilityEvent 分发给宿主视图,然后分发给它的 subview ,以便将它们的文本内容添加到事件中。”并且默认行为是调用“onPopulateAccessibilityEvent”对于 View 本身,然后在其所有子项上“dispatchPopulateAccessibilityEvent”
http://developer.android.com/guide/topics/ui/accessibility/apps.html
该文档在“onPopulateAccessibilityEvent”下说“*如果您对该事件的实现完全覆盖了输出文本,而不允许布局的其他部分修改其内容,则不要在您的代码中调用该方法的 super 实现。”
因此我的代表如下
View.AccessibilityDelegate accessibilityDelegate = new View.AccessibilityDelegate() {
@Override
public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) {
event.getText().add("Apples");
}
};
为什么当我使用键盘导航或使用屏幕点击 EditText View 时,它仍在读取“我的提示文本”而不是“Apples”?
如果我使用调试器,我会看到在我设置事件文本之前,文本是空的,在我设置之后,它是“Apples”,但 TalkBack 仍然读出提示。
奇怪的是,如果我覆盖“onInitializeAccessibilityNodeInfo”并发送一个带有我想要的文本的事件,那么这个想要的文本就会被读出(见下面的代码 fragment )。但这对我来说似乎是错误的,因为“onInitializeAccessibilityNodeInfo”正在对 EditText 的事件使用react,但随后只是引发了一个新事件。
@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);
}
最佳答案
我们可以通过执行以下操作来更改 EditText View 的朗读文本:
View.AccessibilityDelegate accessibilityDelegate = new View.AccessibilityDelegate() {
@Override
public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(v, info);
info.setText("some customized text")
}
};
然后将此委托(delegate)设置为 EditText View 。
关于安卓辅助功能 : How do I change the text read out loud for an EditText View,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25641081/
我是一名优秀的程序员,十分优秀!