Android 导航体系结构碎片重新加载问题

Android 导航体系结构碎片重新加载问题,android,android-fragments,navigation,android-jetpack,android-architecture-navigation,Android,Android Fragments,Navigation,Android Jetpack,Android Architecture Navigation,我在图像库中使用导航架构,当我从片段A转到B,然后返回A时,这3种方法将被再次调用,这将导致我的库重新加载,我应该在片段中加载数据,这样当我从B回到A时,我的方法不会被调用: OnCreateView OnViewCreated 恢复 无论如何,将再次调用片段的生命周期方法。您可以用谷歌搜索如何使用片段或活动生命周期 处理生命周期的主要思想包括保存视图状态、持久化数据等。如果使用片段,则可以使用保留片段:只需在库片段中放置标志setRetainInstance(true),系统就不会调用onCr

我在图像库中使用导航架构,当我从片段A转到B,然后返回A时,这3种方法将被再次调用,这将导致我的库重新加载,我应该在片段中加载数据,这样当我从B回到A时,我的方法不会被调用:

  • OnCreateView
  • OnViewCreated
  • 恢复

  • 无论如何,将再次调用片段的生命周期方法。您可以用谷歌搜索如何使用片段或活动生命周期

    处理生命周期的主要思想包括保存视图状态、持久化数据等。如果使用片段,则可以使用保留片段:只需在库片段中放置标志
    setRetainInstance(true)
    ,系统就不会调用
    onCreate()
    onDestroy()
    方法,例如,旋转手机时。下一步,我建议您使用2017年推出的AndroidArchitectureComponent

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

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


    它的主要思想是,您应该在对象中加载一些可以在视图破坏时存活的内容,并在视图准备这样做时对视图说从该对象获取可用数据。

    导航(…)
    是使用
    片段实现的。通过
    片段导航器
    实例化(…)
    。在提供的示例中,我建议调用
    popbackbackstack()
    返回到上一个片段,而不是
    navigate(…)

    我也面临同样的问题,我的片段(比如片段A)在从其他片段返回时(通过设备返回按钮)被重新加载(片段B)。我试图找到有效的解决方案,但无法找到相同的解决方案。目前,我使用片段生命周期完成了一个临时解决方案。当我们
    popbackbackstack()
    a片段(片段B)时,另一个片段(片段a)它将进入前台,它的
    onCreateView()
    onViewCreated()
    将被调用。因此,我使用此生命周期管理状态。当我们的片段A第一次启动时,它的
    onAttach()
    函数将运行,在此情况下,我将片段状态保存为:

    override fun onAttach(context: Context) {
        super.onAttach(context)
        fragmentStatus = "onAttach"
    }
    
    在onViewCreated()中,我将此状态更改为:

    fragmentStatus = "onViewCreated"
    
    onViewCreated()
    中,我正在检查此状态值

    if (fragmentStatus == "onAttach") {
            fragmentStatus = "onViewCreated"
    //Write your code here for rest of the functionality
    }
    
    所以现在每当这个片段A出现在前台时,它的状态总是
    onViewCreated
    ,直到这个片段被销毁并重新启动


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

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

    这是谷歌安卓团队的伊恩·莱克(Ian Lake)提出的建议


    您可以使用ViewModel保留数据并保持滚动的位置。在Android的导航组件中,每次有片段导航时,都会调用片段的OnViewCreated和onCreateView。将数据保留在ViewModel中,这样它就不会被破坏。

    您找到了解决此问题的方法吗?解决此问题的方法是保留您的在全局变量或演示者(MVP)或ViewModel中列出。如果存在此列表,请不要执行apicall@AVEbrahimi您解决了此问题吗?onViewCreated仍会被调用
    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
    }