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);
}
});
3.子Fragment向父Activity传递数据
这第三点与本文章标题无关,但经常遇到,因此顺带分享。在我们写一个页面的时候,最常见的是一个父Activity包含多个子Fragment,需要通过子Fragment向父Activity发送消息,更新UI。有很多方法可以实现,如EventBus、LiveDataBus等、这里分享一个最简单的方法:通过在fragment中定义接口与Activity共享数据
在子Fragment中定义一个接口并实例化
private MessageCallback mCallback;
//TODO:当前fragment从activity重写了回调接口 得到接口的实例化对象
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
mCallback = (MessageCallback) getActivity();
}
//TODO:定义一个接口
public interface MessageCallback {
void sendMessage();
}
//TODO:在需要传递数据的地方使用,如:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCallback.sendMessage();
}
});
在父Activity中实现这个接口
public class MessageActivity extends AppCompatActivity implements MessageFragment.MessageCallback {
@Override
public void sendMessage() {
//做一些其他事情
doSomething();
}
}
这样就实现了子Fragment向父Activity发送消息的功能了,是不是很简单。