【问题标题】:How do you pass data to a start Fragment from a destination Fragment's FloatingActionButton's OnClickListener when using a NavController?使用 NavController 时,如何将数据从目标 Fragment 的 FloatingActionButton 的 OnClickListener 传递到起始 Fragment?
【发布时间】:2021-01-13 08:01:27
【问题描述】:

我正在尝试在使用 NavController 时将数据从目标 Fragment 的 FloatingActionButton 的 OnClickListener 传递到起始 Fragment。 FloatingActionButton 位于托管所有 Fragment 的 Activity 中。

目前,我可以像这样从 FloatingActionButton 的 OnClickListener 返回上一个 Fragment:

                Bundle bundle = new Bundle();
                bundle.putSerializable(BUNDLE_KEY_SELECTED, selected);
                NavController navController = NavHostFragment.findNavController(FragmentSelectSongs.this);
                navController.popBackStack();

我想将该 Bundle 发送到 start Fragment。这里的文档 Pass data to the start destination 说要设置一个新图形并添加 Bundle。不过,这会破坏后台堆栈。即使我这样做:

                NavController navController = NavHostFragment.findNavController(FragmentSelectSongs.this);
                navController.setGraph(navController.getGraph(), bundle);
                navController.popBackStack();

这将我带回到起始片段。我该如何处理?

我应该从目的地做一个动作开始并传递另一个值,然后弹出两次回栈吗?

【问题讨论】:

  • 如果您尝试将结果返回到已经在后台堆栈上的片段,您是否有理由不使用Navigation API for returning a result
  • 因为“在片段之间传递数据”似乎是最有可能找到答案的地方!感谢您的建议。我决定只将变量存储在主活动中,避免 Android 解决方案的麻烦。

标签: android android-fragments android-navigation-graph


【解决方案1】:

你试过了吗?

navController.navigate(R.id.fragment_id_to_send_bundle, bundle);

【讨论】:

  • 是的。由于所需参数没有默认值,我收到 IllegalArgumentException。问题是当我给参数默认值时,由 safeargs 生成的 actionFragmentAToFragmentB() 方法变成了一个有 0 个参数的方法,我不能再在需要时传递参数。有没有办法通过 navigateTo() 传递参数?
  • 我想通了,但是是否有一些地方存储了参数的字符串值?我现在正在使用硬编码值。 navigateTo() 确实有效。不过,它确实向后台堆栈添加了一个额外的步骤,所以我希望弹出堆栈两次可以解决这个问题。
  • 成功了!我必须使用 navigate(R.id.fragment_id_to_send_bundle, bundle) 而不是 navigateTo(R.id.fragment_id_to_send_bundle, bundle),并确保将所需的参数添加到 Bundle。
  • 哦,对不起,我没有检查方法名称,但确定它是这样的。更新了我的答案
  • 请注意,对于 Safe Args 生成的类,具有默认值的参数会创建 set 方法 - 你会这样做 actionFragmentAToFragmentB().setArg(whatever)
猜你喜欢
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 2021-07-12
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多