viewpager2+tablayout+fragment 实现 滑动 在fragment 设置两个按钮 可以控制左右能不能滑动

布局文件

 <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">


        <com.google.android.material.card.MaterialCardView
            android:id="@+id/card"
            android:layout_width="0dp"
            android:layout_height="38dp"
            android:layout_marginTop="10dp"
            app:cardCornerRadius="5dp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintWidth_percent="0.9"
            app:strokeColor="@color/color_blue"
            app:strokeWidth="1dp">

            <com.google.android.material.tabs.TabLayout
                android:id="@+id/tabLayout_check_details"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:tabBackground="@drawable/tab_selector"
                app:tabGravity="fill"
                app:tabIndicatorColor="@color/transparent"
                app:tabIndicatorFullWidth="false"
                app:tabIndicatorHeight="0dp"
                app:tabMaxWidth="0dp"
                app:tabMode="fixed"
                app:tabPaddingBottom="0dp"
                app:tabPaddingEnd="0dp"
                app:tabPaddingStart="0dp"
                app:tabPaddingTop="0dp"
                app:tabSelectedTextColor="@color/white"
                app:tabTextColor="@color/color_blue" />
        </com.google.android.material.card.MaterialCardView>




        <com.example.screenapptest.view.CustomViewPager2
            android:id="@+id/vp_home"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/card"
            app:layout_constraintWidth_percent="1" />


    </androidx.constraintlayout.widget.ConstraintLayout>

自定义viewpager2

class CustomViewPager2  @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr) {

    private val viewPager2: ViewPager2

    init {
        // 创建 ViewPager2 实例
        viewPager2 = ViewPager2(context)
        // 将 ViewPager2 添加到自定义 ViewGroup 中
        addView(viewPager2)
    }

    // 上一次触摸事件的坐标
    private var lastX = 0f
    private var lastY = 0f

    // 重写事件拦截方法
    override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
        when (ev.action) {
            MotionEvent.ACTION_DOWN -> {
                // 记录触摸事件的初始坐标
                lastX = ev.x
                lastY = ev.y
            }
            MotionEvent.ACTION_MOVE -> {
                // 计算水平和垂直方向上的位移
                val deltaX = ev.x - lastX
                val deltaY = ev.y - lastY

                // 如果水平方向上的位移大于垂直方向上的位移,则认为是左右滑动
                val isHorizontalScroll = Math.abs(deltaX) > Math.abs(deltaY)

                // 如果用户输入被禁用并且方向为垂直,并且当前是左右滑动,则显示吐司提示
                if (!getViewPager2().isUserInputEnabled && getViewPager2().orientation == ViewPager2.ORIENTATION_VERTICAL && isHorizontalScroll) {
                    Toast.makeText(context, CommConstants.NO_SAVE, Toast.LENGTH_SHORT).show()
                }

                // 更新上一次触摸事件的坐标
                lastX = ev.x
                lastY = ev.y
            }
        }

        // 返回默认的事件拦截结果
        return super.onInterceptTouchEvent(ev)
    }
    // 提供获取 ViewPager2 实例的方法
    fun getViewPager2(): ViewPager2 {
        return viewPager2
    }

}

activity 代码


    private fun initTabLayout() {
        val fragmentDetailsList = mutableListOf<Fragment>()
        val fragmentDetailsTitleList = mutableListOf<String>()
        fragmentDetailsList.clear()
        fragmentDetailsTitleList.clear()
        fragmentDetailsList.add(CandidateFragment())
        fragmentDetailsList.add(BloodCollectionFragment())
        fragmentDetailsTitleList.add("初筛")
        fragmentDetailsTitleList.add("采血")

        db.vpHome.getViewPager2().apply {
            val viewpager2Adapter =
                Viewpager2Adapter(fragmentDetailsList, this@TestLoginActivity)
            adapter = viewpager2Adapter
            offscreenPageLimit = fragmentDetailsList.size

            for (position in 0 until fragmentDetailsList.size) {
                db.tabLayoutCheckDetails.addTab(db.tabLayoutCheckDetails.newTab().setText(fragmentDetailsTitleList[position]))
            }
            registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
                override fun onPageSelected(position: Int) {
                    super.onPageSelected(position)
                    if (!isUserInputEnabled) {
                        return
                    }
                    db.tabLayoutCheckDetails.getTabAt(position)?.select()
                }
            })

            // 设置TabLayout的选中监听器,更新ViewPager2的页面
            db.tabLayoutCheckDetails.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
                override fun onTabSelected(tab: TabLayout.Tab?) {
                    tab?.let {
                        if (!isUserInputEnabled) {
                            toast(CommConstants.NO_SAVE)
                            // 如果用户输入被禁用,取消选项卡的选中状态
                            db.tabLayoutCheckDetails.getTabAt(currentItem)?.select()
                        } else {
                            currentItem = it.position
                        }
                    }
                }

                override fun onTabUnselected(tab: TabLayout.Tab?) {
                    if (!isUserInputEnabled) {
                        return
                    }

                }

                override fun onTabReselected(tab: TabLayout.Tab?) {}
            })
        }


    }

class Viewpager2Adapter(
    private val fragmentList: List<Fragment>,
    fragmentActivity: FragmentActivity
) : FragmentStateAdapter(fragmentActivity) {
    override fun createFragment(position: Int): Fragment {
        return fragmentList[position]
    }

    override fun getItemCount(): Int {
        return fragmentList.size
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用ViewPager2+Fragment时,每个Fragment的生命周期会在ViewPager2的切换过程中被调用,具体如下: 1. onAttach():当Fragment与Activity建立关联时调用。 2. onCreate():当Fragment被创建时调用。 3. onCreateView():当Fragment的布局被创建时调用。 4. onViewCreated():当Fragment的布局被创建后调用。 5. onStart():当Fragment可见时调用。 6. onResume():当Fragment与用户交互时调用。 7. onPause():当Fragment失去焦点时调用。 8. onStop():当Fragment不再可见时调用。 9. onDestroyView():当Fragment的布局被销毁时调用。 10. onDestroy():当Fragment被销毁时调用。 11. onDetach():当Fragment与Activity解除关联时调用。 在ViewPager2中,当用户滑动到一个新的Fragment时,会先调用新的Fragment的onAttach()、onCreate()、onCreateView()、onViewCreated()方法,然后再调用旧的Fragment的onPause()、onStop()、onDestroyView()、onDestroy()、onDetach()方法。当用户再次滑动回到旧的Fragment时,会先调用旧的Fragment的onAttach()、onCreate()、onCreateView()、onViewCreated()方法,然后再调用新的Fragment的onPause()、onStop()、onDestroyView()、onDestroy()、onDetach()方法。 需要注意的是,当ViewPager2中的Fragment被销毁后,会调用Fragment的onDestroy()方法,但Fragment的实例对象并没有被销毁,而是被保存在FragmentManager中,当用户再次滑动到该Fragment时,会重新调用Fragment的onCreate()方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值