我正在创建一个启动器应用程序与D-Pad的设备量身定制。当与ViewPager 2工作时,我不得不在D-Pad支持工作,以实现适当的页面切换和聚焦。
我已经在我的应用中引入了导航组件,这样我就可以在应用抽屉中导航了。不幸的是,在将ViewPager 2放入NavGraph并让NavHost处理它之后,我用来获取当前页面/片段引用的代码(childFragmentManager.findFragmentByTag("f${viewPager.currentItem}")
)已经停止工作,始终返回null
。
下面是旧代码,当我没有NavHost设置时,它工作得很好。psLis是一个回调函数,它被传递到HomeFragment(ListAdapter host/initializer),并从那里传递到HomeAdapter(ListAdapter),它设置了一个OnKeyboard来调用最左边/最右边的单元格上的psLis。
HomePager.kt(包含ViewPager 2示例、导航指示灯、'dock'、应用抽屉)
// .....
val psLis: (Char, Int) -> Unit = { direction, pos ->
val curItem = viewPager.currentItem
val TAG = "psLis"
Log.d(TAG, "Page-switch listener initiated.")
if (direction == 'l' && curItem > 0) {
viewPager.currentItem = curItem - 1
val curFragment = // Get page fragment
childFragmentManager.findFragmentByTag("f${viewPager.currentItem}")
Log.d(TAG, "curFragment is $curFragment")
if (curFragment is HomeFragment) {
curFragment.setFocus(pos + 3) // Set the focus within the same row
}
} else if (direction == 'r' && curItem < (NUM_PAGES - 1)) {
viewPager.currentItem = curItem + 1
val curFragment =
childFragmentManager.findFragmentByTag("f${viewPager.currentItem}")
Log.d(TAG, "curFragment is $curFragment")
if (curFragment is HomeFragment) {
curFragment.setFocus(pos - 3)
}
}
}
字符串
HomeFragment.kt(删除/删除主屏幕ListAdapter)
// .....
fun setFocus(pos: Int) {
val child = binding.recyclerView.getChildAt(pos)
child.requestFocus()
}
型
同样,在我让NavHost处理ViewPager 2之后,childFragmentManager.findFragmentByTag("f${viewPager.currentItem}")
才开始返回null
。parentFragmentManager.fragments
返回单个HomePager示例,childFragmentManager.fragments
返回空白列表。
我觉得我已经用尽了更相关的功能,我还没有能够找到任何人面临这个特定的问题上StackOverflow或一般的网络。任何帮助/建议将非常感谢。干杯。
1条答案
按热度按时间mpgws1up1#
使用导航组件时,请尝试使用:
字符串