簡體   English   中英

如何在底部導航中保存片段 state

[英]How to save fragment state in bottom navigation

我知道其他人已經問過這個問題,但我找不到任何人來幫助自己。 我有一個包含三個片段的底部導航視圖。

當我導航出底部導航所在的活動時,我希望能夠將最后訪問的片段保存在底部導航中,並在返回時恢復它。

目前,這是使用bottomNav.selectedItemId完成的,但是不伴隨片段更改。 它恢復了一個空白屏幕,除了我導航到底部導航中的另一個片段並返回。 如何使用當前數據恢復片段?


    val title: String by lazy {
        getName()
    }
    val profileName by lazy {
        profile_drawer_view.findViewById<TextView>(R.id.profile_name)
    }

    //    Get logged-in user
    private val currentUser: User? by lazy {
        authViewModel.currentUser
    }

    private val header by lazy {
        authViewModel.header
    }


    @Inject
    lateinit var viewModelProviderFactory: ViewModelFactory
    private val authViewModel: AuthViewModel by lazy {
        ViewModelProvider(this, viewModelProviderFactory).get(AuthViewModel::class.java)
    }


    val checkConnectionTv by lazy{
        dialog.findViewById<TextView>(R.id.loader_layout_tv)
    }

    lateinit var navController:NavController

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_dashboard)
        changeStatusBarColor(R.color.colorWhite)
        i(title, "Oncreate")

        navController = Navigation.findNavController(this, R.id.dashboard_fragment)

        bottomNav.setupWithNavController(navController)

//

    

    }


    private fun logoutRequest() {
        authViewModel.logout(this)
    }


    override fun onStart() {
        super.onStart()
        bottomNav.selectedItemId = authViewModel.lastFragmentId
        Log.i(title, "onStart")
    }


    override fun onPause() {
        super.onPause()
        authViewModel.lastFragmentId = bottomNav.selectedItemId
    }

    override fun onRestart() {
        super.onRestart()
        i(title, "Restart")
    }

    override fun onDestroy() {
        super.onDestroy()
        i(title, "onDestroy")

    }

}

我遇到了類似的問題。 您應該將所有片段的網絡或數據庫相關 function 移動到活動的視圖模型,並在所有片段中使用sharedViewModel 這將確保您再次訪問該片段時不會重新加載該片段的數據。

實際上,導航組件只支持替換片段,不支持添加片段。 這會導致您的數據丟失並需要再次獲取。

截至目前,這是導航組件的一個已知問題,他們仍在為將來的版本而努力。

您可以通過創建共享視圖模型來使用 tronku 建議的內容,並且每當您導航到片段內的屏幕時,將 state 保存在那里,並且每當您從頭開始重新加載片段時,檢查該共享視圖模型是否有任何先前保存的狀態和如果找到則加載它們,如果它是空的,則加載它們。

我認為您將不得不將整個堆棧跟蹤保存在該父片段中,因為您將需要手動處理后按。

我想我忘了提到我正在使用帶有底部導航的導航組件。

我能夠保存和恢復使用導航控制器訪問的最后一個片段

navController.navigate(authViewModel.lastFragmentId ?: R.id.profileFragment)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM