Android导航组件,如何知道结果是不是设置onViewCreated

Posted

技术标签:

【中文标题】Android导航组件,如何知道结果是不是设置onViewCreated【英文标题】:Android Navigation Components, How to know if result is set onViewCreatedAndroid导航组件,如何知道结果是否设置onViewCreated 【发布时间】:2020-12-19 11:21:39 【问题描述】:

在片段中我setFragmentResultListener并等待结果:

setFragmentResultListener(EnableFingerPrintFragment.ARG_REQUEST_KEY)  _, bundle ->
    bundle.getString(EnableFingerPrintFragment.ARG_RESULT_KEY)
        ?.let  isActivatedResult: String ->
            // DO something
        

findNavController().navigate(R.id.to_enableFingerPrintFragment,)

返回结果时,此片段重新创建并调用onCreateView

如何知道onCreateView 是否是第一次创建片段它来自返回的结果(在目标片段中设置结果之后)?

如何知道结果是否设置onViewCreated来检查这个条件?

【问题讨论】:

有什么解决办法吗? 【参考方案1】:

当您的视图被重新创建时,您可能应该使用您的视图模型来检索数据。例如,当您从 backstack 中弹出一个视图时,您之前的视图会重新创建,但它的视图模型和内部数据不会,所以请考虑一下。

【讨论】:

ViewModel 和 LiveData 的问题在于它们持久存在于数据中!这只是一个事件,如果您正在考虑 SingleLiveEvent 之类的事情,我应该提醒您在正在完成和再次膨胀的片段之间进行通信时考虑片段生命周期! 如果 ViewModel 不适合您。您应该尝试任何其他持久化策略,例如 Shared Preference 或 Room 我已经完成了那个项目,但我不记得我最后做了什么。【参考方案2】:

我认为您必须在 onCreate 中初始化您的侦听器 setFragmentResultListener,当您返回时,您的视图重新创建并且 onCreate 不会调用两次。

https://developer.android.com/training/basics/fragments/pass-data-between

在导航组件的新更新中,您可以使用 liveData 在片段之间轻松发送数据。

https://***.com/a/60757744/7358545

【讨论】:

设置监听的位置没有Must!如果您回到任何片段,无论是否设置侦听器,都会重新创建它。如果我找不到合适的解决方案,也许我必须遵循您的第二个解决方案。 @MortezaRastgoo NavController 替换片段并销毁视图并添加到后台堆栈,因此在片段中 onCreate 在这种情况下只调用一次,但 onCreateView 调用每次弹出并推入后台堆栈 这很好。但是我需要在非常有条件的情况下而不是在 oncreate 或 onCreateView 中设置结果侦听器

以上是关于Android导航组件,如何知道结果是不是设置onViewCreated的主要内容,如果未能解决你的问题,请参考以下文章

使用Android导航组件时如何从后台获取片段?

Android 导航架构组件 - 导航架构组件是不是意味着仅使用单个活动?

在Android中使用导航组件时如何删除默认动画过渡?

是否可以使用 Android 导航架构组件(Android Jetpack)有条件地设置 startDestination?

导航架构组件 - 带有 lambda 表达式的动作导航

Android导航组件不显示片段