繁体   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