Android TalkBack 和片段堆栈

Android TalkBack and fragment stack

对于我处理的应用程序,我需要实现可访问性。除了我必须将片段添加到 activity 的一个屏幕外,一切正常。基本上,上面的片段是一个用于输入密码的拨号键盘。此片段添加了片段事务。

问题是对讲焦点设置在下方片段的元素上。

请问有没有什么方法可以把对讲焦点设置在拨号片段上?我只想"disable"下面的片段获得焦点

谢谢,

查看方法View。sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)。 sendAccessibilityEvent 从 Talkback 更改焦点。我不太了解 Talkback,请在 SO @ When using TalkBack, what is the preferred way to alert the user when the contents of a TextView have changed?.

上阅读 link

祝你好运...

您的问题是 "sending" 焦点不对。将注意力集中在不同的地方通常是一个坏主意,而且无法访问。您的问题是屏幕上有不可见的元素,但 TalkBack 正在关注这些元素。您要做的是从 TalkBack 中隐藏这些元素。实际上,您可能想完全删除它们,但我们假设它们需要出现在屏幕上。您可以做的是将它们从辅助功能服务中隐藏起来:

rootViewOfFragment.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);

这将从 TalkBack 中隐藏这些视图。这是比强制关注特定元素更好的解决方案,因为这通常是 WCag 2.0 下的可访问性违规。尽管如果屏幕上的元素没有完全被您的 "top" 片段隐藏,这也是一种违规行为,您实际上应该保持现状。

更新

我想出了解决办法。您可以在执行片段事务之前禁用第一个片段的可访问性。

rootView = inflater.inflate(R.layout.first_fragment, null, false);

rootView.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);

现在您提交片段事务。第二个片段不会将焦点泄漏到第一个片段。

不要忘记启用第一个片段的可访问性,以防您返回到第一个片段。

if(rootView != null) {
    rootView.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
}

您在使用 fragmentTransaction.add 吗?

如果是这样,您应该使用 fragmentTransaction.replace!

添加功能在点击以下片段视图时也出现问题。

所以请使用替换。

也许您可以在第二个片段恢复时调用 requestAccessibilityFocus()

@Override
public void onResume() {
    super.onResume();
    yourView.requestAccessibilityFocus();
}

添加

view.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);`
view.performAccessibilityAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null);

里面onResume

并添加

view.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);

里面 onPause 适合我。