我正在按照教程here使用TabLayout和
FragmentStatePagerAdapter
。一切都很棒,除了我需要禁用第二个选项卡上的滑动,因为它使用水平滚动。如果对所有选项卡禁用滚动也没关系,但如果仅对第二个选项卡禁用滚动那就太棒了。
对于 ViewPager 来说,我似乎会重写
onInterceptTouchEvent()
方法,但这似乎不是 FragmentStatePagerAdapter
的选项。关于如何做到这一点有什么想法吗?谢谢。
编辑:我只有两个片段,因此如果 FragmentStatePagerAdapter 不合适,我愿意接受建议。
编辑2:无法刷卡的问题已解决。但是,我仍然想知道如何防止仅刷第二个片段。
修改
onInterceptTouchEvent
和 onTouchEvent
以仅排除您想要的选项卡索引:
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
switch(getCurrentItem()){
case 1:
return false;
default:
return super.onInterceptTouchEvent(event);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(getCurrentItem()){
case 1:
return false;
default:
return super.onTouchEvent(event);
}
}
好的,这就是如何完成的:
这是我的 FragmentStateAdapter -
class ViewPagerAdapter(
fragmentManager: FragmentManager,
private val totalTabs: Int,
lifecycle: Lifecycle,
) : FragmentStateAdapter(fragmentManager, lifecycle) {
override fun getItemCount(): Int = totalTabs
override fun createFragment(position: Int): Fragment {
return when (position) {
0 -> RadioFragment()
1 -> ThingsToDoInTheAreaMapFragment()
2 -> SavedRadioStationsFragment()
else -> RadioFragment()
}
}
}
这是 XML:
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:visibility="gone"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toTopOf="@+id/app_bar_layout" />
这是我的实现:
binding.viewPager.adapter = ViewPagerAdapter(
supportFragmentManager,
binding.tabsLayout.tabCount,
lifecycle
)
然后要禁用滑动,请在创建适配器后添加以下行:
binding.viewPager.isUserInputEnabled = false