我会逐一回答你的问题。
但是这样做不起作用,当返回到A页面时所有文本框都会重置。我做错了什么?
从FragmentB中,当用户完成工作并且应用程序调用下面的方法返回FragmentA。
findNavController().navigate(R.id.action_from_B_to_A, dataBundle)
你原本期望应用程序会将用户带回到FragmentA,但实际结果是创建了一个新的FragmentA并将其放置在返回栈的顶部。现在返回栈的情况如下所示。
FragmentA (new instance)
FragmentB
FragmentA (old instance)
因为它是 FragmentA 的全新实例,所以你会看到所有的文本字段都被重置了。
如何正确处理这种情况?
你想启动一个 Fragment,然后从该 Fragment 接收结果,这类似于 Activity 的 startActivityForResult
方法。
在 Android Dev Summit 2019 - Architecture Components 中,2:43 的时候,有一个问题是针对 Android 开发者的。
我们是否可以为 Navigation Controller 创建像 startFragmentForResult
这样的方法?
答案是他们正在开发这个功能,并且将来会提供此功能。
回到你的问题,这是我的解决方案。
步骤1:创建一个名为 SharedViewModel
的类
class SharedViewModel : ViewModel() {
val bundleFromFragmentBToFragmentA = MutableLiveData<Bundle>()
}
步骤二:将以下代码添加到 FragmentA 中
private lateinit var viewModel: SharedViewModel
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProviders.of(requireActivity()).get(SharedViewModel::class.java)
viewModel.bundleFromFragmentBToFragmentA.observe(viewLifecycleOwner, Observer {
val message = it.getString("ARGUMENT_MESSAGE", "")
Toast.makeText(requireActivity(), message, Toast.LENGTH_SHORT).show()
})
}
第三步:将以下代码添加到FragmentB中
private lateinit var viewModel: SharedViewModel
val data = Bundle().apply { putString("ARGUMENT_MESSAGE", "Hello from FragmentB") }
viewModel.bundleFromFragmentBToFragmentA.value = data
requireActivity().onBackPressed()