【问题标题】:Passing data between Parent fragment and Child fragment在父片段和子片段之间传递数据
【发布时间】:2021-01-17 18:03:44
【问题描述】:

我正在为 2 个或更多片段之间的通信而苦苦挣扎

我的应用架构如下所示:

MainActivity (Menu Drawer) 
---->  MealsFragment
---->  ProfileFragment
---->  StatsFragment
---->  SportFragment
---->  ContactUsFragment

(通过点击菜单抽屉 main_container 被选中的 Fragment 替换)

之前,我有单个活动而不是片段,但我读过我需要将它们转换为片段以正确实现菜单抽屉(所以我做到了)。 问题是每个活动都有自己的子活动,它们使用 onActivityResult 与父母沟通。现在我不知道如何处理片段。

场景是这样的:

  1. 从 MainActivity 打开 MealsFragment(有效)
  2. 从 MealsFragment 打开 AddMealFragment(使用 MealsFragment 中的数据),填写表格,然后将用户提供的所有信息返回给 MealsFragment
  3. 将收到的数据用于进一步的操作

我已经看到推荐使用 settargetFragment() 和 getTargetFragment() 的帖子,但我不知道该怎么做,而且 - 更重要的是 - 我不知道之后如何接收数据

【问题讨论】:

  • 如果你已经实现了导航图会更容易。你这样做了吗?如果是这样,我将分享解决方案。
  • 我从未听说过 :( 我是否需要知道这一点才能使我的应用程序正常工作?
  • 如果您使用导航图,您可以将数据从片段发送到片段作为参数。这将使工作更容易。总有另一种做事方式。

标签: java android android-fragments android-fragmentactivity


【解决方案1】:

我希望你知道如何使用Fragment transactions,即使用Fragment Manager 类从后台堆栈中添加或删除片段。如果您不知道,那么最好先了解一下。

现在您知道如何添加或删除片段,在片段之间传递数据是一件简单的事情,所有这些都在片段的Bundle 中,您可以在接收器片段中访问。这是一个例子:

class ConversationFragment : Fragment() {
  companion object {
    const val JOB_REQUEST_ID = "jobRequestId"

    @JvmStatic
    fun newInstance(jobRequestId: String) =
      ConversationFragment().apply {
        arguments = Bundle().apply { putString(JOB_REQUEST_ID, jobRequestId) }
      }
  }
}

为了创建ConversationFragment,我公开了一个newInstance 方法,FragmentManager 或任何其他实体都可以使用该方法来创建一个。但是,他们需要传递一个JOB_REQUEST_ID 才能创建一个。我只是将这个 id 放在 Bundle 中,并将其作为参数传递给片段。在接收方(片段),您可以获得此捆绑包的句柄并检索值:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    arguments?.let {
      jobRequestId = it.getString(JOB_REQUEST_ID)
    }
  }

【讨论】:

    猜你喜欢
    • 2016-07-03
    • 2016-11-21
    • 1970-01-01
    • 2017-03-08
    • 2018-06-24
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    相关资源
    最近更新 更多