导航架构碎片重载问题

时间:2019-01-21 09:00:36

标签: android android-fragments navigation android-jetpack android-architecture-navigation

我在图库中使用导航体系结构,当我从片段A转到片段B,然后返回到A时,再次调用这三种方法,这将导致我的图库重新加载,我应该将数据分段加载,以便当我从B返回到A时不会调用我的方法? :

  1. OnCreateView
  2. OnViewCreated
  3. OnResume

Step A to B

5 个答案:

答案 0 :(得分:1)

诀窍是不要在 onCreateView() 中再次膨胀视图。这将再次调用您的所有生命周期事件,但这将是您维护片段状态的方式。

这是由 google android 团队的 Ian Lake 提出的。这是reference

var binding: FragmentFeedsBinding? = null

   override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    if (binding == null)
        binding = FragmentFeedsBinding.inflate(inflater, container, false)
    return binding?.root
}

答案 1 :(得分:0)

无论如何,片段的生命周期方法将再次被调用。您可以在Google上搜索如何处理片段或活动生命周期。

如何处理生命周期的主要思想包括保存视图状态,持久保存数据等。如果使用片段,则可以使用保留片段:只需在图库片段中放上标记setRetainInstance(true),系统将不会例如,在旋转手机时,请调用onCreate()onDestroy()方法。下一步,我建议您使用2017年You can read about it here.

中引入的AndroidArchitectureComponent

我想在您的情况下,您应该为片段创建ViewModel,将数据加载到ViewModel中,然后将数据放入LiveData对象中。此外,您应该覆盖片段中的onCreate并使片段保留(我刚才已经描述了如何做)并在此处初始化ViewModel。之后,在onViewCreated或onActivityCreated中,您需要通过LiveData和ViewModel观察数据,并仅显示它们而无需重新加载。

这是基本算法。可以通过不同的方法(例如MVP,RxPM,MVVM(基于RxJava和RxAndroid)等)来实现类似的行为。我认为在这里描述所有这些模式并不是我回答的主要目的。互联网上有很多信息(也在StackOverflow上),只需尝试查找即可。

它的主要思想是,您应该在对象中加载一些可以在视图销毁时幸存的对象,并在视图准备就绪时对视图说以从该对象获取可用数据。

答案 2 :(得分:0)

navigate(...)Fragment.instantiate(...)使用FragmentNavigator实现。在提供的示例中,我建议调用popBackStack()而不是navigate(...)

返回上一个片段

答案 3 :(得分:0)

我也面临着同样的问题,我的片段(说片段A )正在从其他片段(通过 Device Back Button 按下)重新加载时strong>片段B )。我试图找出有效的解决方案,但找不到相同的解决方案。目前,我已经使用Fragment生命周期完成了一个临时解决方案。当我们popBackStack()一个片段(片段B )时,另一个即将出现的片段(片段A ),其onCreateView()和{{ 1}}将被调用。因此,我已使用此生命周期管理状态。第一次时,我们的片段A 将启动,其onViewCreated()函数将运行,在此我将片段状态保存为:

onAttach()

在onViewCreated()中,我将此状态更改为:

override fun onAttach(context: Context) {
    super.onAttach(context)
    fragmentStatus = "onAttach"
}

fragmentStatus = "onViewCreated" 内部,我正在将该状态值检查为

onViewCreated()

因此,现在只要此片段A出现在前景中,它始终会以if (fragmentStatus == "onAttach") { fragmentStatus = "onViewCreated" //Write your code here for rest of the functionality } 的状态出现,直到该片段被销毁并重新启动为止。

注意:这是一个临时解决方案,可以避免在Fragment中重新加载您的工作,但是系统会根据其要求重新启动该Fragment。

答案 4 :(得分:0)

您可以使用 ViewModel 来保留数据并保持滚动位置。在 Android 的导航组件中,每次某些片段导航时都会调用片段的 OnViewCreated 和 onCreateView。将数据保存在 ViewModel 中,以免被破坏