Android TalkBack和片段堆栈

12

对于我工作的应用程序,我需要实现可访问性。除了一个屏幕以外,一切都运行正常,这个屏幕上有两个片段添加到我的活动中。基本上,位于上方的片段是用于输入密码的拨号键盘。该片段是通过fragmentTransaction添加的。

问题在于TalkBack焦点被设置在下面片段的元素上。

您知道是否有一种方法可以将TalkBack焦点设置在拨号片段上吗?我只想“禁用”下面的片段来获取焦点。

谢谢,

7个回答

10

更新

我找到了解决方案。在进行片段事务之前,您可以禁用第一个片段的可访问性。

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);
}

这个可以正常工作,但是在下一个滑动片段中子视图没有获得焦点。有什么解决办法吗? - fargath
@fargath,你需要使用第二个代码示例来启用第一个片段的可访问性。 - Martin Osorio
1
这个解决方案非常好。如果您正在使用数据绑定,则在onCreateView中使用:MyFragmentLayoutBinding binding = DataBindingUtil.inflate(inflater, R.layout.my_fragment_layout, container, false); binding.getRoot.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS); - Martin Osorio

3

你是否在使用 fragmentTransaction.add?

如果是,你应该使用 fragmentTransaction.replace!

add 方法也会导致点击下面的 fragment 视图时出现问题。

因此,请使用 replace。


即使使用replace,仍然遇到此问题。 - Astha Garg

1
你的问题不是将焦点“发送”到正确的位置。强制焦点在不同位置之间移动通常是一个不好的想法,并且不可访问。你的问题是屏幕上有一些不可见的元素,但 TalkBack 正在关注它们。你想要做的是隐藏这些元素,使它们对 TalkBack 不可见。实际上,你可能想要完全删除它们,但让我们假设它们需要在屏幕上。你可以从辅助功能服务中隐藏它们:
rootViewOfFragment.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);

这将隐藏TalkBack中的那些视图。这比强制聚焦到特定元素更好,因为这通常是WCag 2.0下的无障碍违规行为。但是,如果屏幕上的元素没有完全被您的“顶部”片段隐藏,这也是一种违规行为,您应该让事情保持原样。

1
这对我没用。有人想出了解决方法吗? - O__O
我也尝试过了,但还是不行。我会继续努力修复它,看看能否找到有效的解决方案。 - SamIAmHarris
评论区的人们是否能够找到相同的解决方案? - Pulkit

0

0

强制让无障碍焦点围绕某些元素是不好的想法。A:这违反了WCag 2.0的无障碍性规定。B:如果用户向后滑动呢?他们仍然会聚焦那些他不想聚焦的东西。 - MobA11y

0

添加

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 内部对我有效。


0
也许当第二个片段恢复时,您可以调用requestAccessibilityFocus()。
@Override
public void onResume() {
    super.onResume();
    yourView.requestAccessibilityFocus();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接