android - 带导航组件的 backstack

标签 android kotlin android-fragments navigation android-ktx

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

这是一些代码:

主要 Activity :

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

表单 fragment :

(我想保存其进度并添加到后台的 fragment )

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)

    }

}

预先感谢您的帮助!

最佳答案

我一直在努力解决类似的问题。 导航组件中的 fragment 不保留其状态。如果您在导航时保持数据进度,则需要创建一个范围仅限于导航图的 SharedViewModel。

在 fragment 中:

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

创建此类:

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

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

 val data = navGraphScopedViewModel.sharedData

希望对你有帮助

关于android - 带导航组件的 backstack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64686583/

相关文章:

java - 在 Android 中通过 USB 将 ArrayList<integer>() 发送为 byte[] 格式

java - 拒绝类,因为它未通过编译时验证

java - 如何使用 JSON 填充子项微调器?

kotlin - 自引用对象中是否存在java.lang.ExceptionInInitializerError?

android - 如何设置DialogFragment的标题?

android - 刷新 fragment 回到上一个 fragment

Android 在通知点击时打开特定的标签 fragment

android - 在 C2DM 注册过程中将额外数据传递给 C2DMReceiver?

android - 如何使用接口(interface)刷新 ViewPager2 中的 fragment 中的数据

java - Lambda 表达式在看似相同的 kotlin 中不起作用