如何将数据从一个片段传递到以前的片段?

Shw*_*han 12 android

我要去FragmentA-> FragmentB.现在从FragmentB我想将数据传递给FragmentA.So我该怎么做?

目前我正在使用FragmentB-> FragmentA getCustomFragmentManager().popBackStack(); 但没有传递任何值.

Shw*_*han 39

在FragmentA中

    FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
    FragmentB frgamentB = new FrgamentB();
    fragmentB.setTargetFragment(FrgamentA.this, AppConstant.FRAGMENT_CODE);
    ft.addToBackStack(fragment.getClass().getName());
    ft.add(R.id.content, fragment, tag);
    ft.commit();
Run Code Online (Sandbox Code Playgroud)

现在覆盖onActivityResult()FragmentA

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK) {
      if (requestCode==AppConstant.FRAGMENT_CODE){
         int addID = data.getIntExtra("addressID", 0);
         String addressLine=data.getStringExtra("addressLine");
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

在FragmentB中(单击后退按钮)

Intent intent = new Intent(context, FragmentB.class);
intent.putExtra("addressID", list.get(position).getId());
intent.putExtra("addressLine", list.get(position).getAddressLine1());
getTargetFragment().onActivityResult(getTargetRequestCode(), RESULT_OK, intent);
getFragmentManager().popBackStack();
Run Code Online (Sandbox Code Playgroud)


Rez*_*_Rg 6

如果使用 Kotlin 和 android 导航架构,您可以像这样使用,从 Navigation 2.3.0-alpha02 版本开始。

在片段 B 上设置结果:

findNavController().previousBackStackEntry?.savedStateHandle?.set("key", result)
Run Code Online (Sandbox Code Playgroud)

使用相同的密钥观察片段 A 上的结果:

    findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<Type>("key")?.observe(
    viewLifecycleOwner) {result ->
    // Do something with the result.
}
Run Code Online (Sandbox Code Playgroud)


Tay*_*har 5

由于 setTargetFragment 已被弃用。您可以使用setFragmentResultListener

片段A中

setFragmentResultListener("KEY") { reqKey, bundle ->
    if (reqKey == "KEY")
    {
        val result = bundle.getString("RESULT")
        Toast.makeText(requireContext(), "Result: $result", Toast.LENGTH_LONG).show()
    }
}
Run Code Online (Sandbox Code Playgroud)

片段B中

val resultBundle = Bundle().apply { putString("RESULT", "result from FragmentB") }
setFragmentResult("KEY", resultBundle)
Run Code Online (Sandbox Code Playgroud)