将数据从当前片段传回前一个片段

新手上路,请多包涵

我在我的应用程序中使用导航抽屉。我有一个 MainActivity,其余的都是 Fragments。所以问题是假设我有三个片段,如 A、B、C。

现在在 A 中我有一个按钮,我正在从 A > B 发送数据。

例如 putSring(“datafrom A”,“datafrom A”);

现在在 B 中,我从 A 接收数据。

我在 B 中有一个按钮,我正在从 B > C 发送数据。

例如 putSring(“来自 B 的数据”,“来自 B 的数据”);

现在在 C 中,我从 B 接收数据。

然后,我在 C 中有一个 Button,并从 C>B 发送数据。

例如 putSring(“来自 C 的数据”,“来自 C 的数据”);

所以,似乎在 B 中,我从两个不同的片段中获取数据。我尝试了所有使用的活动,它与 startActivityforresult 一起工作得很好。但当一切都是碎片时,我该如何管理。

原文由 chris 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 322
2 个回答

当您将数据从片段 A 发送到片段 B 时,请使用如下相同的布尔值:-

片段A -> 片段B

 FragmentB ldf = new FragmentB ();
Bundle args = new Bundle();
args.putBoolean("BOOLEAN_VALUE",true);
ldf.setArguments(args);

getFragmentManager().beginTransaction().add(R.id.container, ldf).commit();

当您将数据从片段 C 发送到片段 B 时,使用与片段 A 到片段 B 中使用的相同的 BOOLEAN,如下所示 -

片段 C -> 片段 B

 FragmentB ldf = new FragmentB ();
    Bundle args = new Bundle();
    args.putBoolean("BOOLEAN_VALUE",false);
    ldf.setArguments(args);

    getFragmentManager().beginTransaction().add(R.id.container, ldf).commit();

最后我们必须检查 FragmentB 中收到的值是否来自 Fragment A OR FragemntC

片段B

    Boolean getValue= getArguments().getBoolean("BOOLEAN_VALUE");
   if(getValue)
   {
    //VALUE RECEIVED FROM FRAGMENT A
   }
   else
   {
   //VALUE RECEIVED FROM FRAGMENT C
   }

原文由 Ravindra Kushwaha 发布,翻译遵循 CC BY-SA 3.0 许可协议

更新

Androidx Activity 1.2.0-alpha02Androidx Fragment 1.3.0-alpha4 开始, 官方 Android 开发人员指南 建议在已弃用的 Activity.onActivityResult(int, int, Intent)Fragment.setTargetFragment(Fragment, int) -ac-7e-38e38e 上使用 Activity/Fragment Result API方法:

强烈建议使用 AndroidX Activity 1.2.0-alpha02 和 Fragment 1.3.0-alpha02 中引入的 Activity Result API。

因此,要将数据从 C 传回片段 B,请在片段 B 的 FragmentManager --- 上调用 setFragmentResultListener() --- ,如以下示例所示:

 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // Use the Kotlin extension in the fragment-ktx artifact
    setFragmentResultListener("requestKey") { requestKey, bundle ->
        // We use a String here, but any type that can be put in a Bundle is supported
        val result = bundle.getString("bundleKey")
        // Do something with the result
     }
}

在片段 C 中,使用相同的 requestKey 使用 setFragmentResult() API 将结果设置为相同的 FragmentManager 。例子:

 setFragmentResult("requestKey", bundleOf("bundleKey" to "result"))

可以在 本指南 中找到更多详细信息。


以下答案已弃用

您可以在从 B 启动 Fragment C 时调用setTargetFragment() 。示例:

 FragmentC fragmentC = FragmentC.newInstance();
fragmentC.setTargetFragment(FragmentB.this, REQUEST_CODE);
getFragmentManager().beginTransaction().replace(R.id.container, fragmentC).commit();

然后当你想将数据从C传回片段B时,你可以调用下面的代码:

 getTargetFragment().onActivityResult(
                getTargetRequestCode(),
                Activity.RESULT_OK,
                new Intent().putExtra("datafrom C", "datafrom C")
);

并从片段 B 中的onActivityResult()方法中获取它:

 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode==REQUEST_CODE && resultCode==Activity.RESULT_OK) {
        String datafromC = data.getStringExtra("datafrom C");
    }
}

原文由 CodePlay 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题