Android TalkBack 和片段堆栈

Posted

技术标签:

【中文标题】Android TalkBack 和片段堆栈【英文标题】:Android TalkBack and fragment stack 【发布时间】:2015-07-25 09:05:51 【问题描述】:

对于我正在开发的应用程序,我需要实现可访问性。一切正常,除了一个屏幕,我必须将片段添加到我的活动中。基本上,上面的片段是输入密码的拨号键盘。这个片段被添加了一个片段事务。

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

你知道有没有办法在拨号片段上设置对讲焦点?我只想“禁用”下面的片段以获得焦点

谢谢,

【问题讨论】:

【参考方案1】:

更新

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

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 您必须使用第二个代码示例启用第一个片段的可访问性 这个解决方案效果很好。如果您使用数据绑定,则 onCreateView 使用: MyFragmentLayoutBinding binding = DataBindingUtil.inflate(inflater, R.layout.my_fragment_layout, container, false); binding.getRoot.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);【参考方案2】:

你在使用 fragmentTransaction.add 吗?

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

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

所以请使用替换。

【讨论】:

【参考方案3】:

您的问题不在于将焦点“发送”到正确的位置。将注意力集中在不同的地方通常是一个坏主意,而且难以接近。您的问题是屏幕上有一些不可见的元素,但被 TalkBack 聚焦。您想要做的是从 TalkBack 中隐藏这些元素。实际上,您可能希望完全删除它们,但我们假设它们需要出现在屏幕上。您可以做的是从无障碍服务中隐藏它们:

rootViewOfFragment.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);

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

【讨论】:

这对我不起作用。有没有人想出一个解决方案? 也试过了,还是不行。我会继续尝试解决这个问题,看看我能不能找到一些有用的东西。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

添加

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 里面为我工作。

【讨论】:

【参考方案6】:

查看方法 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? 上的链接。

祝你好运……

【讨论】:

强制关注可访问性是个坏主意。答:这是 WCag 2.0 下的可访问性违规。 B:如果用户向后滑动怎么办?他们最终还是会关注那些他不想关注的事情。

以上是关于Android TalkBack 和片段堆栈的主要内容,如果未能解决你的问题,请参考以下文章

android开发手机talkback模式总结

Android - 从堆栈中间删除特定片段不起作用

MvvmCross Android 片段添加到后台堆栈

Android - TalkBack 可访问性侧重于 Recyclerview 中的滑动删除按钮

Android 如何在阅读列表项计数时停止包含页脚行的 TalkBack

Android Jetpack Navigation、BottomNavigationView 与 Youtube 或 Instagram 类似正确的后退导航(片段后退堆栈)?