Android Fragment 基于Result API 通信

2022-07-27  本文已影响0人  仙狗许小格

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);
    }
});
上一篇 下一篇

猜你喜欢

热点阅读