更新
从Androidx Activity 1.2.0-alpha02和Androidx Fragment 1.3.0-alpha4开始,官方 Android 开发者指南建议使用活动/片段结果 API 替代已弃用的Activity.onActivityResult(int, int, Intent)
和Fragment.setTargetFragment(Fragment, int)
方法:
强烈建议使用在 AndroidX Activity 1.2.0-alpha02 和 Fragment 1.3.0-alpha02 中引入的 Activity Result APIs。
因此,要将数据从 C 传递回 B 片段,请在片段 B 的 FragmentManager
上调用 setFragmentResultListener()
,如以下示例所示:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setFragmentResultListener("requestKey") { requestKey, bundle ->
val result = bundle.getString("bundleKey")
}
}
在片段 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")
);
然后在您的 Fragment 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");
}
}