【问题标题】:Don't start every fragment at once in ViewPager不要在 ViewPager 中一次启动每个片段
【发布时间】:2020-02-19 08:07:44
【问题描述】:

我在我的应用中实现了 View Pager。它在片段之间滑动,问题是,即使只显示第一个片段,也会创建另一个片段。 这会导致问题,因为在第二个片段中我显示了一个 Loading Bar,这样它就会显示在第一个片段中而不是第二个片段中。

这是我的 ViewPager 代码:


class FragmentViewPagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {

    override fun getItem(position: Int): Fragment {
        if (position == 0){
            return VentFragment()
        }
        return ConversationsFragment()
    }

    override fun getCount(): Int {
        return 2
    }

}

在第二个片段中,我在onCreateView 中以这种方式调用加载栏:

 loading = ProgressDialog(context)

        loading.setTitle(getString(R.string.loading))
        loading.setMessage(getString(R.string.fetching_your_data))
        loading.setCanceledOnTouchOutside(false)
        loading.show()

是因为上下文吗?我似乎找不到错误...

【问题讨论】:

  • 离屏页面限制至少为 1。第二个片段将在 ViewPager 中创建。如果您不希望这样做,请不要使用 ViewPager。

标签: android android-fragments


【解决方案1】:

问题是,即使只显示第一个片段,也会创建另一个片段

这就是ViewPager 的工作方式。它需要第二个片段可用,以便在用户滑动时过渡到它,而不是在用户开始滑动后等待您创建它。

在第二个片段中,我正在显示一个加载栏,这样它就显示在第一个片段而不是第二个片段中

您的第二个片段有错误。片段——尤其是ViewPager——不应该修改片段本身之外的 UI。如果您修复了此错误,您的ViewPager 问题应该会消失。

【讨论】:

  • @AndréNogueira:片段不应该仅仅因为被创建而显示对话框。因此,要么切换到片段内进度指示器,要么不显示ProgressDialog,直到用户执行需要它的操作(例如,单击按钮开始工作)。
【解决方案2】:

因此可以使用 ViewPager 对 UI 数据进行“延迟加载”(我是这样做的),这样数据和加载栏仅在页面被选中时显示。

更新:

我建议您迁移到 ViewPager2,因为与 ViewPager 不同,ViewPager2 正确支持 Fragment 生命周期。

这意味着您可以在 Fragment 的 onResume 方法中轻松更新占位符(或启动加载栏)

我刚刚使用 ViewPager 方法完成了一个使用 ViewPager2 的完整示例,请参阅https://stackoverflow.com/a/60253406/2373819(Update2 有完整示例,类似于如果您仍想使用 ViewPager,您可以这样做)

请注意,这两种方法都会导致屏幕更新显示正确的(最新)数据,这可能是在转换期间或在转换完成后立即使用 ViewPager2 和 onResume,但随后您可能会获得不正确的旧数据或进行第二次屏幕更新以获取正确的最新数据。

【讨论】:

  • 我想说,从纯粹的 UX/UI 角度来看,在转换后更新视图会破坏 ViewPager 提供的无缝滚动/转换体验。还更新 Fragment 实现或具有“更新”方法打破了 Fragment 生命周期挂钩方法的传统。
  • 是的,UI 在过渡期间会更新,但根据您要更新的内容,除非非常缓慢地滑动屏幕,否则几乎看不到,至于打破 Fragment 生命周期,生命周期必须达到页面转换开始后立即处于“活动”状态,因此更新就像用户按下刷新按钮或其他事件一样。如果您认为 Fragment 在“活动”时永远不应该更改,那么您理解生命周期是错误的。
  • 正如您可以回答问题一样,我有权批评您的回答。感谢您承认会有更新延迟,因为这证明了我的评论。
  • 其实谢谢你的批评,它让我检查了我的答案并想出了一个更好的答案。虽然 ViewPager 在视图更新时会恢复,但 ViewPager2 并非如此
  • 请注意,关于生命周期,ViewPager2 的工作方式与 ViewPager1 的 BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 完全相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多