Fragment之间的通讯方法有很多种,这里只讲述Result API 。
从Fragment 1.3.0-alpha04起,FragmentManager 新增了 FragmentResultOwner接口,顾名思义 FragmentManager 成为了 FragmentResult 的持有者,可以进行 Fragment 之间的通信。
1.同级Fragment之间
从FragmentB向FragmentA传递数据,首先给fragmentA设置监听器
getParentFragmentManager().setFragmentResultListener("requestKey", this, new FragmentResultListener() {
@Override
public void onFragmentResult(@NonNull String key, @NonNull Bundle bundle) {
// Bundle支持任意的数据类型
String result = bundle.getString("bundleKey");
//做一些其他事情
doSomething();
}
});
在FragmentB中,点击发送数据,需要注意的是,FragmentB必须使用和FragmentA一样的FragmentManager,使用相同的requestKey
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Bundle result = new Bundle();
result.putString("bundleKey", "result");
getParentFragmentManager().setFragmentResult("requestKey", result);
}
});
2.在父Fragment和子Fragment间传递数据
子Fragment向父Fragment传递数据
为了从子Fragment向父Fragment传递数据,当调用setFragmentResultListener(),父Fragment应该使用getChildFragmentManager()而非getParentFragmentManager()
getChildFragmentManager().setFragmentResultListener("requestKey", this, new FragmentResultListener() {
@Override
public void onFragmentResult(@NonNull String key, @NonNull Bundle bundle) {
// Bundle支持任意的数据类型
String result = bundle.getString("bundleKey");
//做一些其他事情
doSomething();
}
});
父Fragment向子Fragment传递数据 同理
在父Fragment中,点击发送数据
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Bundle result = new Bundle();
result.putString("bundleKey", "result");
getChildFragmentManager().setFragmentResult("requestKey", result);
}
});
网友评论