ViewPager2 + 辅助功能 + Talkback 在尝试使用滑动手势更改焦点和滚动时出现问题

5
我一直在尝试使用ViewPager2和Talk-back实现辅助功能,但焦点无法移动到第二个部分可见的项之后。我想要使用Talk-back和辅助功能遍历和滚动ViewPager2,但是没有成功实现。

--------------
| <item> | <item> | <item> | <item> | <item> |
--------------

请帮帮我。我已经搜索了很多,尝试了各种方法,但是对我来说都没有用。

 ViewPager2.accessibilityDelegate = object : AccessibilityDelegate() {
        override fun onRequestSendAccessibilityEvent(
            host: ViewGroup?,
            child: View?,
            event: AccessibilityEvent?
        ): Boolean {
            if (event?.eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {
                ViewPager2.currentItem = ViewPager2.indexOfChild(child)
            }
            return super.onRequestSendAccessibilityEvent(host, child, event)
        }
    }
3个回答

2

在ViewPager 1中遇到了类似的问题。 - Arun P M

0

我设法使用以下代码工作。它并不是最优化的,但是这是一个解决方案,直到谷歌修复此问题。

val recyclerView = viewPager.getChildAt(0) as RecyclerView
        recyclerView.accessibilityDelegate = object : View.AccessibilityDelegate() {
            override fun onRequestSendAccessibilityEvent(
                host: ViewGroup?,
                child: View?,
                event: AccessibilityEvent?
            ): Boolean {
                if (event?.eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {
                    val position = recyclerView.indexOfChild(child)
                    viewPager.setCurrentItem(position, true)
                    val recyclerView = viewPager.getChildAt(0) as RecyclerView
                    recyclerView.apply {
                            viewTreeObserver.addOnGlobalLayoutListener(object: ViewTreeObserver.OnGlobalLayoutListener {
                                override fun onGlobalLayout() {
                                    viewTreeObserver.removeOnGlobalLayoutListener(this)
                                    recyclerView.smoothScrollToPosition(position)
                                }
                        })
                    }
                    child?.requestFocus()
                    viewPager.requestLayout()
                }
                return super.onRequestSendAccessibilityEvent(host, child, event)
            }
        }

0

如果有人在使用上述解决方案时遇到无法滑动所有子项的错误,请使用 recyclerView.getChildAdapterPosition(child) 来获取位置。

RecyclerView 可能比适配器中的项目少(例如,在 100 个列表中显示 10 个项目)。在这种情况下,使用 indexOfChild(child) 的位置将无法让您向下滑动第 10 个元素。

smoothScrollToPosition 支持滚动到适配器位置,对我来说效果不错。


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