我在图库中使用导航体系结构,当我从片段A转到片段B,然后返回到A时,再次调用这三种方法,这将导致我的图库重新加载,我应该将数据分段加载,以便当我从B返回到A时不会调用我的方法? :
答案 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.
我想在您的情况下,您应该为片段创建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 中,以免被破坏