选择标签时如何防止viewpager2翻页

问题描述

我有一个与 tablayout 相关联的 viewpager2,其中包含许多不同的片段保存文本视图,如果用户尚未完成每​​个片段上的某些文本视图,我不希望用户选择另一个标签。因此,当用户选择另一个选项卡时,我会显示一条消息,要求完成当前片段数据。当用户在 TabSelectedListener 的“onTabUnselected”方法中选择另一个选项卡时,我尝试选择旧选项卡,但没有成功。这是代码,请查看我想防止片段更改的 Todo 注释。

viewPager = view.findViewById(R.id.mypager)

TabLayoutMediator(tabLayout,viewPager,true,false,TabLayoutMediator.TabConfigurationStrategy { tab: TabLayout.Tab,position: Int ->
        tab.text = titles[position]
    }).attach()

tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
    override fun onTabSelected(tab: TabLayout.Tab?) {

    }

    override fun onTabUnselected(tab: TabLayout.Tab?) {
        val currFragment= fragmentSet[tab!!.position]
        if (!currFragment.validateFields()) {
            //Todo: don't change tab,remain in this tab something like tab.aborselectedtTransition
        }
    }

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

})

有人可以帮我吗?

解决方法

我自己解决了,而不是使用 onTabUnselected 最好在 onTouch 事件上使用侦听器,这样可以防止 viewpager 更改从 onTouchListener 返回 true 的页面。如果你喜欢,请给我投票。

viewPager = view.findViewById(R.id.mypager)

TabLayoutMediator(tabLayout,viewPager,true,false,TabLayoutMediator.TabConfigurationStrategy { tab: TabLayout.Tab,position: Int ->
                tab.text = titles[position]
                tab.view.setOnTouchListener { v,event -> onTabLayoutTouch(v,event) }
 }).attach()

private fun onTabLayoutTouch(view:View,event:MotionEvent):Boolean {
    val viewTab = view as TabLayout.TabView
    val tabIndex = viewTab.tab?.position?:-1

    var validationOk = true

    if (event.action == MotionEvent.ACTION_DOWN ) {

        val currFragment = fragmentSet[viewPager.currentItem]

        if (viewPager.currentItem!=tabIndex) {
            val validation = currFragment.validateFields()
            if (!validation.validationResult && event.action==MotionEvent.ACTION_DOWN) {
                showMessage(context,"Compila i dati obbligatori.\n ${validation.message}")
                validationOk = false
            }
        }
    }
    return !validationOk
}