ViewPager2嵌套不同高度Fragment显示异常问题求助
问题描述
我在StackOverflow上查询过该问题,参考了如下帖子但未找到有效解决方案:
- Adding fragments of Different height to a Tab Layout
- Tabs with dynamic height in fragment
我实现了一个包含2个Fragment的标准Tab布局,第一个Fragment因内容较少高度更短。Tab切换功能正常,但第二个Fragment的底部内容无法显示,而第一个Fragment能完整展示。
若给第一个Fragment的布局添加android:paddingBottom="120dp",第二个Fragment可正常显示,但第一个Fragment会被过度拉长。
我尝试在onTabSelected方法中调用commissionProgramDetailsTabFragmentAdapter.notifyDataSetChanged(),还尝试动态添加第二个Fragment内容并调用requestLayout(),但均无效。
效果截图
当前效果
- 当前第一个Tab Fragment:

- 当前第二个Tab Fragment:

期望效果
- 期望第一个Tab Fragment:

- 期望第二个Tab Fragment:

相关代码
HomeActivity.kt
private fun initializeCommissionProgramDetailsTab() { // initialize components tabLayoutCommissionProgramDetails = findViewById<TabLayout>(R.id.tabLayoutCommissionProgramDetails) viewPager2CommissionProgramDetails = findViewById<ViewPager2>(R.id.viewPager2CommissionProgramDetails) // initialize adapter commissionProgramDetailsTabFragmentAdapter = CommissionProgramDetailsTabFragmentAdapter(supportFragmentManager, lifecycle) // Add Tabs to TabLayout tabLayoutCommissionProgramDetails.addTab(tabLayoutCommissionProgramDetails.newTab().setText(R.string.tab_commission_program_details__commission)) tabLayoutCommissionProgramDetails.addTab(tabLayoutCommissionProgramDetails.newTab().setText(R.string.tab_commission_program_details__program_details)) // Assign Adapter to ViewPager2 viewPager2CommissionProgramDetails.adapter = commissionProgramDetailsTabFragmentAdapter // Add OnTabSelectedListener tabLayoutCommissionProgramDetails.addOnTabSelectedListener(object: TabLayout.OnTabSelectedListener{ override fun onTabSelected(tab: TabLayout.Tab?) { if (tab != null) viewPager2CommissionProgramDetails.currentItem = tab.position commissionProgramDetailsTabFragmentAdapter.notifyDataSetChanged() } override fun onTabUnselected(tab: TabLayout.Tab?) { } override fun onTabReselected(tab: TabLayout.Tab?) { } }) // registerOnPageChangeCallback viewPager2CommissionProgramDetails.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) { super.onPageSelected(position) tabLayoutCommissionProgramDetails.selectTab(tabLayoutCommissionProgramDetails.getTabAt(position)) } }) }
CommissionProgramDetailsTabFragmentAdapter.kt
class CommissionProgramDetailsTabFragmentAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) : FragmentStateAdapter(fragmentManager, lifecycle) { override fun getItemCount(): Int { return 2 } override fun createFragment(position: Int): Fragment { return if (position == 0) CommissionTabFragment() else ProgramDetailsTabFragment() } }
fragment_commission_tab.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" tools:context=".CommissionTabFragment"> <LinearLayout android:orientation="horizontal" android:paddingBottom="0dp" android:layout_marginVertical="24dp" android:layout_width="match_parent" android:layout_height="wrap_content"> <RelativeLayout android:layout_weight="0.33" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:text="$0" style="@style/TabCounterTextView" android:textColor="@color/tab_yellow" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" /> <TextView android:text="@string/commission_status_pending" style="@style/TabLabelTextView" android:textColor="@color/tab_yellow" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" /> </LinearLayout> </RelativeLayout> <RelativeLayout android:layout_weight="0.33" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:text="$0" style="@style/TabCounterTextView" android:textColor="@color/tab_blue" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" /> <TextView android:text="@string/commission_status_approved" style="@style/TabLabelTextView" android:textColor="@color/tab_blue" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" /> </LinearLayout> </RelativeLayout> <RelativeLayout android:layout_weight="0.33" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:text="$0" style="@style/TabCounterTextView" android:textColor="@color/tab_green" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" /> <TextView android:text="@string/commission_status_paid" style="@style/TabLabelTextView" android:textColor="@color/tab_green" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" /> </LinearLayout> </RelativeLayout> </LinearLayout> </FrameLayout>
fragment_program_details_tab.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/fragmentLayoutMain" tools:context=".ProgramDetailsTabFragment"> <LinearLayout android:id="@+id/linearLayoutProgramDetailsTabFragment" android:orientation="vertical" android:paddingHorizontal="24dp" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:text="@string/fragment_program_details__program_name" style="@style/TabProgramDescription" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" /> <TextView android:id="@+id/textViewProgramDescription" android:text="@string/fragment_program_details__program_description" style="@style/TabProgramDescription" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textMultiLine" android:layout_marginBottom="8dp" /> <TextView android:text="@string/fragment_program_details__commission_type" style="@style/TabProgramDescription" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" /> <TextView android:text="@string/fragment_program_details__commission_amount" style="@style/TabProgramDescription" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" /> </LinearLayout> </FrameLayout>
内容的提问来源于stack exchange,提问作者Caner Burc BASKAYA
相关产品推荐
相关产品推荐

