You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

期望效果

  • 期望第一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:44:53