【发布时间】:2019-11-07 13:09:43
【问题描述】:
根据https://developer.android.com/training/tv/start/navigation
您应该将导航顺序设置为循环,以便最后一个 控件将焦点引导回第一个。
我已尝试为 RecyclerView 项目实现此类行为:
fun RecyclerView.loopFocusVertically() {
viewTreeObserver.addOnGlobalLayoutListener {
val children = getAllChildren()
val firstFocusableItem = children.firstOrNull { it.isFocusable }
val lastFocusableItem = children.lastOrNull { it.isFocusable }
firstFocusableItem?.let { it.nextFocusUpId = lastFocusableItem?.id ?: it.id }
lastFocusableItem?.let { it.nextFocusDownId = firstFocusableItem?.id ?: it.id }
}
}
所以在布局更改时,我让第一个视图有nextFocusUpId 引用最后一个视图,最后一个视图nextFocusDownId 引用第一个视图。但它只适用于所有视图都实际布局在屏幕上的情况,这在一般情况下显然不是真的。 RecyclerView 实际上是回收视图,所以最后一个视图和第一个视图可能不会同时出现在屏幕上
如何在leanback模式下实现rv的焦点循环?
我尝试使用来自leanback 库的androidx.leanback.widget.VerticalGridView,但它也没有必需的行为。
默认情况下,从 rv 焦点的第一个可聚焦项目向上按会跳转到 rv 之外的其他可聚焦视图,这不太合适
【问题讨论】:
标签: android android-tv leanback