【问题标题】:backstack with navigation component带有导航组件的 backstack
【发布时间】:2020-11-04 19:33:35
【问题描述】:

在两个片段上使用导航组件,我的应用程序当前在调用navigateUp() 时销毁了一个片段(使用setupActionBarWithNavController()),因此当我输入已删除的片段时,所有进度都丢失了,我正在尝试更改我将片段添加到后台堆栈(并且只有片段的一个实例),但我一直在努力解决这个问题......

这里有一些代码:

MainActivity:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        loginRepository = LoginRepository()
        if (!loginRepository.checkLoggedInState()) {
            goToLoginActivity()
        }

        Log.d("FirebaseMain", "onCreate: ${loginRepository.checkLoggedInState()}")

        //MyApplication.app.currentUser
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

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

        // setup custom action bar
        setSupportActionBar(findViewById(R.id.toolbar))

        // adds a return button in the ActionBar.
        NavigationUI.setupActionBarWithNavController(this, navController)
    }

FormFragment:

(我要保存进度并添加到后台堆栈的片段)

class FormFragment : Fragment() {

    private lateinit var binding: FragmentFormBinding

    private val checkListRecyclerAdapter = CheckListRecyclerAdapter(
        hashMapOf(
            0 to "mirrors",
            1 to "blinkers1",
            2 to "blinkers11",
            3 to "blin4kers",
            4 to "blink3e1123rs",
            5 to "blink6ers",
            6 to "blin53kers",
            7 to "blin8kers",
            8 to "blin7kers",
            9 to "blin43kers",
            10 to "blin32kers",
            11 to "blin322kers",

            )
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        binding = DataBindingUtil.inflate(inflater, R.layout.fragment_form, container, false)

        binding.rvCheckList.apply {
            // this is used to load the data sequentially from top to bottom,
            this.layoutManager = LinearLayoutManager(context)

            // the adapter that loads the data into the list
            this.adapter = checkListRecyclerAdapter
        }

        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    }

}

提前感谢您的帮助!

【问题讨论】:

    标签: android kotlin android-fragments navigation android-ktx


    【解决方案1】:

    我一直在努力解决一些类似的问题。 导航组件中的片段不会保持其状态。如果您在导航时保持数据进度,则需要创建一个范围为 Navigation Graph 的 SharedViewModel。

    在片段中:

    private val navGraphScopedViewModel by navGraphViewModels<NavGraphViewModel>(R.id.your_nav_graph)
    

    创建这个类:

    class NavGraphViewModel : ViewModel() {
        var sharedData=  CustomObject()
    }
    

    您可以从所有片段中访问和设置数据:

     val data = navGraphScopedViewModel.sharedData
    

    希望对你有帮助

    【讨论】:

    • 感谢您的帮助,它有效!但我有一个问题,你输入的内容有什么区别:kotlin private val navGraphScopedViewModel by navGraphViewModels&lt;NavGraphViewModel&gt;(R.id.your_nav_graph) kotlin private val navGraphScopedViewModel: NavGraphViewModel by viewModels(),因为你提到的(第一个)运行良好并保存了我的数据,但是当我更改为 by viewModels() 它不起作用
    • 太棒了!!我明白。您必须在一个片段中使用 navGraphViewModels(R.id.some_nav_graph),VM 受益于特定的导航图或嵌套图。否则,当创建 VM 的 Activity/Fragment 将是唯一访问 VM 数据的 Activity/Fragment 时,通过 viewModels() 很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    相关资源
    最近更新 更多