发生的情况是,当片段的高度发生变化时,ViewPager2 不会刷新自己的高度(例如,如果您在内部使用 RecyclerView)。
为了解决这个问题,我们需要计算用户选择选项卡时的高度。这可以使用以下方法完成注册页面更改回调 https://developer.android.com/reference/androidx/viewpager2/widget/ViewPager2?authuser=1#registerOnPageChangeCallback(androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback) and onPageSelected
registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
// Here we need to calculate height
}
})
现在,我们需要计算片段的高度。为此,我们需要访问片段及其根视图。这可以在创建 ViewPagerAdapter 时使用提供给 ViewPagerAdapter 的fragmentManager 来完成,例如这里我们使用childFragmentManager:PagerViewAdapter(childFragmentManager, lifecycle)
registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
// Because the fragment might or might not be created yet,
// we need to check for the size of the fragmentManager
// before accessing it.
if (childFragmentManager.fragments.size > position) {
val fragment = childFragmentManager.fragments.get(position)
fragment.view?.let {
// Now we've got access to the fragment Root View
// we will use it to calculate the height and
// apply it to the ViewPager2
updatePagerHeightForChild(it, binding.viewPager)
}
}
}
})
// This function can sit in an Helper file, so it can be shared across your project.
fun updatePagerHeightForChild(view: View, pager: ViewPager2) {
view.post {
val wMeasureSpec =
View.MeasureSpec.makeMeasureSpec(view.width, View.MeasureSpec.EXACTLY)
val hMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
view.measure(wMeasureSpec, hMeasureSpec)
if (pager.layoutParams.height != view.measuredHeight) {
pager.layoutParams = (pager.layoutParams)
.also { lp ->
// applying Fragment Root View Height to
// the pager LayoutParams, so they match
lp.height = view.measuredHeight
}
}
}
}
注意:我们正在访问viewPager
使用绑定,如果您不使用绑定,请以您自己的方式提供 viewPager,也许可以使用findViewById()
限制:异步加载内容
如果您有一些动态加载内容,您可能需要结合解决方案ViewTreeObserver.OnGlobalLayoutListener
,我还没有测试过。
参考:https://issuetracker.google.com/u/0/issues/143095219 https://issuetracker.google.com/u/0/issues/143095219