布局文件
<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
}
}