父片段与子片段通信

3

我一直在搜索如何最好地使嵌套片段与父片段通信的方法,但没有找到。Android文档指出:

所有片段之间的通信都通过关联的Activity完成。两个片段永远不应该直接进行通信。

假设我有一个画廊应用程序,其中有一个ViewPagerFragment(父)ImageFragment(子),用于在单击时全屏显示图像。我需要将Files的ArrayList从我的父片段传递到子片段。什么是适当的方法?

1)在父片段中创建一个getter,并在子片段中使用getParentFragment()来访问此方法?

2)实现接口并通过Activity进行通信,但如果子片段没有ID,我如何从Activity中找到它呢?

3)或者在父片段中使用以下方法:

ChildFragment fragment =(ChildFragment)getChildFragmentManager().findFragmentById(R.id.child_fragment_id);

然后在子片段中使用setter。

但是,我如何获取childFragment的ID?

提前感谢大家!

3个回答

16
如果您想要让子片段与父片段进行通信,可以在子片段中使用getParentFragment()方法。
示例:
public class ExampleParentFragment extends Fragment {

    public int getCount() {
        return 10;
    }
}

public class ChildFragment extends Fragment {


    void doAction() {
        Fragment parentFragment = getParentFragment();

        if(parentFragment instanceof ExampleParentFragment) {
            int count = ((ExampleParentFragment) parentFragment).getCount();
        }
    }
}

4
我理解Fragment和Fragment之间的通信通过Activity是为了协调由同一Activity协调的兄弟Fragment。
在这种情况下,兄弟Fragment由父Fragment协调,因此我认为通信应该由父Fragment管理。
如果您直接使用Fragment,则可以使用ChildFragmentManager()。
如果您正在使用ViewPager,则将ChildFragmentManager传递给ViewPager而不是传递FragmentManager。
如果必须传递一个列表,我认为最简单的方法是当ChildFragment准备好接收它时,通过调用ParentFragment上的方法来请求它。它总是可以通过getParentFragment()获取其实例。
我不确定调用getParentFrament()以获取列表的最安全的地方,但您可以尝试在onCreateView()中,在onActivityCreated()中或在onResume()中。
要调用返回列表的方法,您可以将父Fragment转换为您扩展的特定Fragment类,否则可以定义一个接口,其中包含返回列表的方法,并使扩展的父Fragment实现它。
然后在子Fragment中,通过接口引用父Fragment调用方法并获取列表。

那么实际上没有标准的方法吗?使用接口与使用getParent()没有优势吗? - Suleyman
使用接口更加干净和灵活,因为子片段可以从任何父片段获取列表而不知道其特定类,甚至可以从 Activity 获取。唯一的条件是父片段/Activity 实现了该接口。 - Juan
非常感谢您的解释!我选择了getParent()方法,但我认为我要实现一个接口! - Suleyman

0

应该使用Bundle将数据作为参数传递给片段。因此,当启动子片段时,只需将ArrayList(序列化或其他方式)传递给它。


但这是绝对必要的吗?File类实现了Serializable,所以我必须使用它,但是相比于通过getParent()访问父级,它不是更慢吗? - Suleyman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接