导航架构片段重载问题

AVE*_*imi 15 navigation android android-fragments android-jetpack android-architecture-navigation

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

  1. 创建视图
  2. 视图创建
  3. 在恢复

步骤 A 到 B

Dan*_*aid 5

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

这是由谷歌 Android 团队的 Ian Lake 建议的。这是参考

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
}
Run Code Online (Sandbox Code Playgroud)


小智 0

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

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

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

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

它的主要思想是,您应该在对象中加载一些在视图销毁时可以生存的东西,并告诉视图在视图准备好时从该对象中获取可用数据。