- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个双语(英语 + 西类牙语)android 应用程序。我正在我的应用程序中实现可访问性,我希望 Talkback 以西类牙语阅读西类牙语单词,以英语阅读英语单词。英语和西类牙语单词将位于单独的 TextView 中。我的应用程序语言环境是英语,因此 Talkback + google 文本到语音引擎不会用西类牙语读取西类牙语单词,而是用英语读取它们,并且更经常地读出它们的字母(预期行为)。
是否有任何解决方法或 android 推荐的解决方案来实现相同的目的。
最终,我希望 Talkback 或自定义无障碍服务能够用英语读出英语单词,用西类牙语读出西类牙语单词。
最佳答案
免责声明:您必须格外小心使用此解决方案!覆盖 TalkBack 的 TTS 行为非常非常粗略。从可访问性的角度来看,有许多边缘情况可能会使这种行为变得笨拙、笨拙且非常糟糕。只有当公告的样式是特定于应用程序和所需功能的行为时,才应使用此解决方案。否则,此解决方案会破坏有关与用户代理兼容性的各种 WCAG 2.0 成功标准,并且从可访问性/可用性的角度来看通常是一个糟糕的想法!
在很多情况下,当我看到这样的问题时,我会犹豫是否提供答案,以免给开发人员提供他们不理解的工具。请不要在典型的应用程序中这样做,这是一个糟糕的主意。话虽如此,我相信这种特殊情况需要它,并且在这种情况下这是一个非常干净的解决方案。在创建 Activity 时执行以下操作:
findViewById(android.R.id.content).setAccessibilityDelegate(new View.AccessibilityDelegate() {
private TextToSpeech mTts = new TextToSpeech(MainActivity.this, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
mTts.setLanguage(new Locale("es"));
//Probably other things you should do to ensure TTS is initialized before requesting it speaks something.
}
});
private boolean isSpanishView(View view) {
return true;
}
@Override
public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child, AccessibilityEvent event) {
switch (event.getEventType()) {
case AccessibilityEvent.TYPE_ANNOUNCEMENT:
case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: {
if (isSpanishView(child)) {
String speakableText = null;
if (event.getText() != null) {
speakableText = event.getText().toString();
} else if (event.getContentDescription() != null) {
speakableText = event.getContentDescription().toString();
}
if (speakableText != null) {
mTts.speak(speakableText.toString(), TextToSpeech.QUEUE_ADD, null);
//Prevent the default propagation of this event, have have handled it.
return false;
}
}
}
default:
return super.onRequestSendAccessibilityEvent(host, child, event);
}
}
});
基本上我们在这里所说的是将可访问性委托(delegate)附加到我们 Activity 的 Root View 。查看所有弹出的辅助功能事件。检查它是否是宣布某事的事件。如果是,请检查它是否是包含西类牙语文本的 View 。如果是,请允许我们的西类牙语 TTS 引擎宣布它,而不是让通风口传播。在所有其他情况下让 android 做它的事情。
关于Android Talkback 公告本地化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44426853/
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
背景 fragment 创建它的 View ,然后开始网络操作。网络操作完成后,根据网络操作的结果,创建各种类型的 subview 并将其添加到 fragment 的 View 中。 问题 如果一个
我有一个简单的 View Controller ,它在 viewDidLoad() 中执行此操作. DispatchQueue.main.asyncAfter(deadline: DispatchTi
我正在使用带有多个 TextView 和 LinearLayout 的线性布局。示例屏幕: 每当我访问该屏幕时,TalkBack
为了提高我的 Lisp 程序的效率,我想在我的代码中插入这一行: (optimize (speed 3) (safety 0) (debug 0) (space 0)) 目前我认为我应该把它放在每个文
我想让我的 discord 机器人根据 channel ID 向某个 channel 发布公告。我知道如何使用 message.channel.send() 让机器人在与之交谈的任何 channel
我正在尝试使用以下代码为 Liferay 公告 portlet 制作一个钩子(Hook): package com.ahc.hook.service.impl; import com.liferay.
我在共享主机上有一个网站,在每个页面请求上使用这些 HTTP header 进行响应: HTTP/1.1 200 OK Date: Thu, 21 Sep 2017 14:34:46 GMT Serv
我在共享主机上有一个网站,在每个页面请求上使用这些 HTTP header 进行响应: HTTP/1.1 200 OK Date: Thu, 21 Sep 2017 14:34:46 GMT Serv
我有一个带有 pickerView 作为 inputView 的 textField。 现在,当我打开画外音并选择 textField 时,画外音将显示为:“数量:3(textField 的内容)”,
在 iOS 中使用 Voice Over 时,调用 UIAccessibility.post(notification:argument:)宣布字段错误实际上并不宣布错误。 我有一个提交按钮,当聚焦按
我是一名优秀的程序员,十分优秀!