首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓导航组件saveState和restoreState

安卓导航组件saveState和restoreState
EN

Stack Overflow用户
提问于 2020-07-24 12:27:29
回答 1查看 2.8K关注 0票数 5

伙计们我需要你们的帮助。

我使用android导航组件,希望在用户按下按钮后保存回栈,然后再恢复它。我找到了两种方法

navController.saveState(): BundlenavController.restoreState(bundle: Bundle).

但我在使用上有问题。saveState的工作看起来很棒(我看到了包和内部的栈),但是我不知道如何使用restoreState,因为文档中说:

从包中还原所有导航控制器状态。应该在调用setGraph.之前调用它。

https://developer.android.com/reference/kotlin/androidx/navigation/NavController#restorestate

好的,我做了,看起来像是叠后恢复了,但是在屏幕上我看到了第一个片段(而不是我保存它时的那个)。我做错了什么?

代码:

FirstFragment

代码语言:javascript
复制
    private val TAG = this::class.java.name

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_first, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        btn_forward.setOnClickListener { findNavController().navigate(R.id.action_firstFragment_to_secondFragment) }
        btn_back.setOnClickListener { requireActivity().onBackPressed() }
    }

}

SecondFragment

代码语言:javascript
复制
class SecondFragment : Fragment() {
    private val TAG = this::class.java.name

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_second, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        btn_forward.setOnClickListener { findNavController().navigate(R.id.action_secondFragment_to_thirdFragment) }
        btn_back.setOnClickListener { requireActivity().onBackPressed() }
    }

}

ThirdFragment

代码语言:javascript
复制
class ThirdFragment : Fragment() {
    private val TAG = this::class.java.name

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_third, container, false)
    }


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        btn_finish.setOnClickListener {
            (requireActivity() as MainActivity).saveState() //here save bundle
            requireActivity().finishAfterTransition()
        }
        btn_back.setOnClickListener { requireActivity().onBackPressed() }
    }

}

MainActivity

代码语言:javascript
复制
class MainActivity : AppCompatActivity() {
    private val TAG = "MySuperActivity"

    lateinit var navController: NavController
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.d(TAG, "onCreate($savedInstanceState) called")

        initNavController()
    }

    private fun initNavController() {
        val navHostFragment = nav_host_fragment as NavHostFragment
        val graphInflater = navHostFragment.navController.navInflater

        val graph = graphInflater.inflate(R.navigation.main_graph)

        navController = navHostFragment.navController
        navHostFragment.childFragmentManager
        if (App.instance.savedBundle != null) {
            Log.d(TAG, "bundle: ${App.instance.savedBundle}")
            navController.restoreState(App.instance.savedBundle)
            graph.startDestination = R.id.thirdFragment
        }

        navController.graph = graph
        Log.d(TAG, "navController.currentDestination: ${navController.currentDestination}")
        Log.d(TAG, "navController.graph.startDestination: ${navController.graph.startDestination}")
    }

    fun saveState(){
        App.instance.savedBundle = navController.saveState()
        Log.d(TAG, "saveState() : ${App.instance.savedBundle}")
    }
}

这里有一些日志:日志

完整代码:github

EN

回答 1

Stack Overflow用户

发布于 2021-04-05 06:13:03

我不确定我的答案是否对你有帮助,但我有很多问题试图从处理旋转中拯救导航状态。我所遇到的问题来自导航组件的旧版本,我更新到最近的版本,它解决了这个问题:

代码语言:javascript
复制
def android_navigation = '2.3.4'
implementation "android.arch.navigation:navigation-fragment-ktx:$android_navigation"
implementation "android.arch.navigation:navigation-ui-ktx:$android_navigation"
implementation "androidx.navigation:navigation-dynamic-features-fragment:$android_navigation"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63073561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档