根据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实际上回收视图,因此屏幕上不可能同时存在最后视图和第一个视图。
如何在精简模式下实现rv对焦环?我尝试过从精简库中使用androidx.leanback.widget.VerticalGridView,但它也没有所需的行为。
默认情况下,从rv焦点的第一个可聚焦项按压到rv之外的其他可聚焦视图,这是不太合适的。
发布于 2019-11-23 09:02:41
默认情况下,从rv焦点的第一个可聚焦项按下
跳转到rv之外的其他可聚焦视图,这并不合适。
首先,对于UX来说,如果您的列表上有视图,那么如果您想滚动到最后一项,或者转到上面的视图,那么按下将是一个问题。
说到这里,我建议您只从底部给出循环选项,如果您在列表上面有一个视图,也可以获得焦点。
一般情况下,我建议您检查VerticalGridView/HorizontalGridView,以便在向后倾斜的应用程序中添加行和列表。
在这个示例中,我调整了它以使用RecyclerView来回答您的问题。
为此,您必须捕获按钮事件,检查它是否是最后一项,如果是,请将焦点请求到第一项。
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP) {
if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_DOWN) {
if (onDownClick(event)) {
return true;
}
}
}
return super.dispatchKeyEvent(ev);
}
public boolean onDownClick(KeyEvent event) {
int currentIndex = 0;
if (mAdapter != null) {
currentIndex = mAdapter.indexOf(mCurrentItem);
}
if (currentIndex == mAdapter.size() - 1) {
mListRecycler.scrollToPosition(0);
if (mListRecycler.findViewHolderForAdapterPosition(0) != null) {
mListRecycler.findViewHolderForAdapterPosition(0).itemView.requestFocus();
}
return true;
}
return false;
}https://stackoverflow.com/questions/58749479
复制相似问题