gpt4 book ai didi

安卓辅助功能 : How do I change the text read out loud for an EditText View

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:16:09 25 4
gpt4 key购买 nike

默认情况下,辅助功能服务将为 EditText View 读出以下内容

  • 如果 EditText 有输入的值 = 它会读出该值
  • 如果没有输入值=它会读出“提示”

我希望它在两种情况下读出完全不同的内容。

我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com