【问题标题】:How to pre-load a fragment before showing?如何在显示之前预加载片段?
【发布时间】:2015-10-14 20:00:54
【问题描述】:

在我的活动中,我有几个全屏片段,每个片段都从 Web 下载一些数据(使用异步任务)并将它们显示给用户。片段一次显示一个。

更具体地说,每个片段都从 sqlite 数据库中读取一些 url,并在将它们显示在列表中之前获取内容,如果这很重要的话。数据加载任务可以在 OnCreate() 函数中完成。

当我显示启动画面时,我想预加载所有片段(至少开始下载)。很像 viewpager 预加载它的片段。

我想知道如何实现这一目标?我尝试在我的活动的 OnCreate() 函数中初始化/创建所有片段,希望片段的 OnCreate() 可以更早地调用,但是片段的 OnCreate() 和 OnCreateView() 函数在片段被调用之前不会被调用即将向用户展示。

【问题讨论】:

    标签: android fragment


    【解决方案1】:

    听起来您需要将模型(下载的数据)与视图(片段)分开。一种方法是在您的活动中开始下载 AsyncTasks,而不是在每个片段中开始它们。然后,当最终显示片段时,它们可以显示已下载的数据(或微调器或其他指示下载过程仍在执行的指示)。

    【讨论】:

    • 确实如此,我也想过。我现在不这样做的原因是,我有几个片段附加到活动中,每个片段都承载一些数据。如果我把所有的数据下载/更新任务都放到activity中,最终会变成一个繁琐的activity,而且我的宿主activity和fragment之间也产生了非常强的耦合,这在一定程度上违背了fragment的目的。
    【解决方案2】:

    Fragment 的 onActivityCreated(Bundle) 告诉 Fragment 它的活动已经完成了自己的 Activity.onCreate()。

    因此,您对此问题的解决方案是在您的FragmentonActivityCreated(Bundle) 中初始化或创建或执行您想要在创建片段之前预加载的内容

    documents for fragment's lifecyle

    【讨论】:

      【解决方案3】:

      您可以开始加载的最早速度是静态单例或Application Class

      【讨论】:

        【解决方案4】:

        我最终做的是以下,(1)将所有片段添加到容器中。所以他们(和他们的视图)将被创建和初始化。 (2) 隐藏那些不使用的,只显示我希望用户看到的。 (3) 使用 FragmentTrasaction.show()/FragmentTrasaction.hide() 来操作可见性,而不是 FragmentTrasaction.add() 或 FragmentTrasaction.replace()。

        如果您采用这种方法,请注意所有片段都将缓存在内存中。但好处是片段之间的切换会快速高效。

        【讨论】:

        • “快速”是,“高效”不是
        • @MartinKonecny,我知道你在说什么。但在我的应用程序中,用户会相当频繁地在所有片段之间切换。我不希望他们等待数据加载。你有更有效的方式来实现逻辑吗?
        • 能否详细说明第一步? “将所有片段添加到容器中”是什么意思?谢谢。
        【解决方案5】:

        我遇到了同样的问题,然后我使用了这种方法,假设我们在片段中有一个 EditText,那么我们可以使用这样的代码

        @Override
        public void onViewCreated(View view, Bundle savedInstanceState) {
        
            //this method allows you to input or instantiate fragments before showing this to an activity conidering id is "editTextEditProfileFirstName"
            EditText firstName = (EditText) getActivity().findViewById(R.id.editTextEditProfileFirstName);
        
            firstName.setText("This is my first name", TextView.BufferType.EDITABLE);
            super.onViewCreated(view, savedInstanceState);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-10-28
          • 2016-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-16
          • 1970-01-01
          相关资源
          最近更新 更多