【问题标题】:Android Navigation Component saveState and restoreStateAndroid导航组件saveState和restoreState
【发布时间】:2020-07-24 12:27:29
【问题描述】:

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

我使用 android 导航组件,想在用户按下按钮后保存 backstack 并在之后恢复它。我找到了两种方法

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

但是我在使用它时遇到了问题。似乎 saveState 工作得更好(我看到里面的包和 backstack),但我不明白如何使用 restoreState,因为文档说:

从包中恢复所有导航控制器状态。 这应该在调用 setGraph 之前调用。

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

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

代码:

第一个片段

    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

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() }
    }

}

第三个​​片段

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

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}")
    }
}

这里有一些日志:logs

完整代码:github

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    我不确定我的回答是否对您有所帮助,但我在尝试从处理旋转中保存导航状态时遇到了很多问题。我遇到的问题来自旧版本的导航组件,我更新到最新版本,它解决了这个问题:

    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"
    

    【讨论】:

      猜你喜欢
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多