宿主Fragment和ViewPager的Fragment item之间的通信

mat*_*oni 1 android android-fragments

两个片段之间的通信是否有任何标准模式,其中一个片段托管另一个片段?这篇文章与其他片段通信解释了如何在两个(独立?)片段之间进行通信,其中Activity通信中介是。然而,这种“模式”并不适合我的情况。

我创建了包含ViewPager. ViewPager的项目,片段,产生一些需要在托管片段中处理的事件。由于托管片段应该是一个独立的组件,因此我想Activity从通信过程中省略。

在这种情况下,注册听众的最佳地点是什么?

dom*_*der 5

我们的解决方案是将您链接到的模式从“与我的活动沟通”推广到“与我的父母沟通”,这可以是一个活动或另一个片段。

\n\n

我们并不总是期望 Activity 实现一个接口并将其转换为onAttach,而是使用一个实用方法来查找当前片段的有效回调,并在我们想要调用回调的地方使用它。

\n\n
/**\n * @param fragment The fragment to get the listener for.\n * @param listenerClass The class of the listener to get.\n * @param <T> Type of the listener to get.\n * @return A listener object for the given fragment, cast from the owning parent fragment or\n * Activity, or null if neither is a listener.\n */\n@Nullable\npublic static <T> T getListener(@NonNull Fragment fragment, @NonNull Class<T> listenerClass) {\n    T listener = null;\n    if (listenerClass.isInstance(fragment.getParentFragment())) {\n        listener = listenerClass.cast(fragment.getParentFragment());\n    }\n    else if (listenerClass.isInstance(fragment.getActivity())) {\n        listener = listenerClass.cast(fragment.getActivity());\n    }\n\n    return listener;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这表示:给定一些片段和接口回调类型,我拥有的片段是否实现该接口?如果是这样就用那个。如果没有,我的 Activity 是否实现了该接口?如果是这样,请使用它。本质上,我们沿着层次结构向上寻找处理程序。

\n\n

所以在你的孩子片段中:

\n\n
private void invokeListener() {\n    Listener listener = getListener(this, Listener.class);\n    if (listener != null) {\n        listener.onThingHappened();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后在你的父片段中:

\n\n
public class ParentFragment extends Fragment implements Listener {\n    @Override\n    public void onThingHappened() {\n        // Handle view pager fragment event\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您稍后创建子级的实例并将其添加到 Activity,只需让该 Activity 实现回调,它就可以工作\xe2\x84\xa2。

\n\n

希望有帮助!

\n