使用Android导航组件中的navigationUp传递数据/捆绑

Bha*_*ara 4 android android-fragments android-architecture-navigation android-safe-args

我找到了问题,但是代码中没有解决方案

我想在有backpress / manual back发生时获取数据。我navigateUp()过去经常回去。如何将数据传递到上一个片段?navigateUp()没有任何工具可以将数据传递到上一个片段。甚至我也没有找到使用Safe Args的解决方案。它正在转发数据。我想在向后的Frad B-> Frag A中使用。

我的代码回到上一个片段

Navigation.findNavController(view).navigateUp()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我的问题是,如何获取上一个片段中的数据。我可以使用以下方法从Frag B导航至Frag A

Mah*_*uri 8

您可以使用NavigationResult库。基本上它startActivityForResult只是用于导航组件中的片段。


val*_*dak 8

请使用官方androidx的组件。setFragmentResultListener()setFragmentResult()方法:

implementation "androidx.fragment:fragment-ktx:1.3.5"
Run Code Online (Sandbox Code Playgroud)

干杯;)


Nat*_*yev 5

根据developer.android.com,您可以将common用于要使用其活动范围共享数据ViewModel的片段。

步骤如下:

  1. 创建将保留数据的视图模型:
class SharedViewModel : ViewModel() {
    val dataToShare = MutableLiveData<String>()

    fun updateData(data: String) {
        dataToShare.value = data
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 观察Fragment1中的数据更改:
class Fragment1 : Fragment() {

    private lateinit var viewModel: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel = ViewModelProviders.of(activity!!).get(SharedViewModel::class.java)
        viewModel.dataToShare.observe(this, Observer<String> { dataFromFragment2 ->
            // do something with data
        })
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 更新其中的数据,Fragment2并且如果您能正确处理导航,现在,您应该能够接收有关的数据更改Fragment1
class Fragment2 : Fragment() {

    private lateinit var viewModel: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel = ViewModelProviders.of(activity!!).get(SharedViewModel::class.java)

        updateDataButton.setOnClickListener { v ->
            viewModel.updateData("New data for fragment1")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望答案会有所帮助。

  • 在Fragment之间共享ViewModel会增加源代码的复杂性。 (3认同)