【问题标题】:How to prevent viewpager2 from turning page when a tab is selected选择选项卡时如何防止viewpager2翻页
【发布时间】:2021-01-27 18:38:05
【问题描述】:

我有一个 viewpager2 绑定到一个包含许多不同片段的 tablayout,如果他没有完成每个片段上的一些 textview,我不希望用户选择另一个选项卡。因此,当用户选择另一个选项卡时,我会显示一条消息,要求完成当前的片段数据。当用户在 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?) {
    }

})

有人可以帮帮我吗?

【问题讨论】:

  • 也许像tab.view.clickable = false 之类的显而易见的东西在右侧选项卡的内部策略 + 在需要时创建新的 /reattach TabLayoutMediator?
  • 试图分离 TabLayoutMediator,但我不知道该怎么做
  • 根据当前选项卡和验证结果将我的代码添加到tab.text = titles[position] 的位置...并重新附加
  • 不幸的是不起作用,它失去了选项卡选择,您无法再更改选项卡,因此您可以重新提交您的片段数据,,,

标签: android android-tablayout android-viewpager2


【解决方案1】:

我自己解决了,而不是使用 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 2019-07-29
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多