安卓嵌套片段-片段交互

6
Android最佳实践中,关于Fragment之间的交互(详见此处此处)要求Activity实现由子Fragment定义的监听器。然后Activity负责管理片段之间的通信。
据我了解,这是为了使片段之间保持松耦合。然而,
  1. Is this also the case for nested fragments? I can imagine it might make sense for a nested fragment to report directly to it's parent fragment instead of the Activity.

  2. If a nested fragment has its parent fragment implement it's listener, how would one (or should one) require the parent fragment to do this. In other words, is a similar to the paradigm to the following but for Fragments:

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    
        try {
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }
    
3个回答

4
如果有人想要一个确保父级上下文实现回调的实现示例,而不关心它是活动还是片段,则以下内容适用于我:
@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof Callbacks) {
        mCallbacks = (Callbacks) context;
    } else {
        if (getParentFragment() != null && getParentFragment() instanceof Callbacks) {
            mCallbacks = (Callbacks) getParentFragment();
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement " + TAG + ".Callbacks");
        }
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mCallbacks = null;
}

祝你愉快!


1
只要在片段中定义接口,就可以让父活动或父片段实现它。没有规定片段不应该实现子片段的接口。一个例子是片段A有两个子片段B、C,A实现B的接口,当A得到回调时,可能需要更新片段C。与活动完全相同,只是不同层次。

然而,问题中发布的Google链接中描述的方法鼓励/强制将其作为“Activity”来处理,通过在片段的onAttach()中附加监听器,并在不是“Activity”的情况下抛出错误。 - bcorso
文档鼓励片段不应直接与另一个片段通信,而不是必须是活动。 - CChi
1
谷歌建议如果监听器没有被活动实现,抛出异常是否有特定的原因?我应该只是移除那段代码吗? - bcorso
这是因为这样做的主要目的是为了实现片段间通信,如果活动没有实现接口,在这些情况下片段本身就毫无用处。因此,您可能需要告诉活动:“等一下,您忘记实现我定义的接口了”。 - CChi
关于您的第二个问题,您可以从子片段调用getParentFragment,并执行instanceof判断是否实现了接口。 - CChi
谢谢您的建议!强制使用监听器似乎使得附加监听器变得更容易,而无需调用 setListener(...),但这也将限制 Fragment 只能与 ActivityFragment 一起使用,而不能同时使用。最好的方法可能是完全放弃它。 - bcorso

0

您可以使用getParentFragment()实现与子/父交互的相同模式。父片段是指通过其ChildFragmentManager添加此片段的任何片段。如果此片段直接附加到活动上,则此方法返回null。


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