Android Fragment 基于Result API 通信

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发送消息的功能了,是不是很简单。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容