使用导航架构停止重新加载上一个片段

Vas*_*sim 12 android android-jetpack

我们如何通过按后退按钮停止从当前片段重新加载前一个片段

前任。好像我们正在从 List-fragment 移动到 Details Fragment 后按下不需要通过使用 Android Jet Pack 和导航架构再次重新加载 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" />
Run Code Online (Sandbox Code Playgroud)

Bad*_*ane 18

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

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

  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

 }
Run Code Online (Sandbox Code Playgroud)

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

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

  • 正如 getView() 方法所示,Fragment 已经“持有视图”。也不需要手动缓存它 - 因为现在`onDestroyView`不会*实际上*销毁视图。这可能很奇怪。虽然我猜它是有效的,但它有点hacky。 (2认同)