【问题标题】:Stop reloading previous fragment by using Navigation architecure使用导航架构停止重新加载上一个片段
【发布时间】:2019-05-16 06:27:58
【问题描述】:

我们如何通过按返回按钮来停止从当前片段重新加载上一个片段

例如。 就好像我们正在从 List-fragment 移动到 Details Fragment 时无需使用 Android Jet Pack 和 Navigation Architecture 再次重新加载 List-fragment

<fragment
        android:id="@+id/my_nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/navigation_graph" />

【问题讨论】:

    标签: android android-jetpack


    【解决方案1】:

    导航组件目前仅支持片段替换。因此,您将无法像使用手动片段事务那样添加()片段。

    但是,如果您担心重新膨胀布局和重新获取片段的数据,则可以通过以下两种方法轻松解决。

    1. 创建视图后,将其存储在一个变量中,并在调用 onCreateView() 时使用它。
    private var view: View? = null
    
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    
        if (view == null) {
            view = inflater.inflate(R.layout.fragment_list, container, false)
                    //...
        }
    
        return view
    
     }
    

    来源:https://twitter.com/ianhlake/status/1103522856535638016

    1. 将 ViewModel 与 Fragment 一起使用,并将所需的数据保存为成员变量。 这样,替换关联的fragment时,数据不会被清除。 ViewModel 仅在片段的 onDestroy() 上被清除,这只会在您销毁父活动时发生。 https://developer.android.com/images/topic/libraries/architecture/viewmodel-lifecycle.png

    【讨论】:

    • 片段已经“持有视图”,如getView() 方法所示。也不需要手动缓存它 - 因为现在 onDestroyView 不会实际上破坏视图。这可能很奇怪。虽然我猜它有效,但它有点 hacky。
    • @EpicPandaForce 我在这里看不到任何骇人听闻的东西。 onCreateView() 无论如何都会被调用,因为片段替换() 已经按照所讨论的用例发生了。如果未完成手动缓存,则在 onCreateView() 上重新膨胀会影响性能,尤其是在布局复杂的情况下。
    • 这应该如何工作?每次切换标签时,片段都会完全重建
    • 它仍然会重新加载
    • 仅查看 null 条件就足以避免重新加载。我已经解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2019-06-14
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    相关资源
    最近更新 更多