mat*_*oni 1 android android-fragments
两个片段之间的通信是否有任何标准模式,其中一个片段托管另一个片段?这篇文章与其他片段通信解释了如何在两个(独立?)片段之间进行通信,其中Activity通信中介是。然而,这种“模式”并不适合我的情况。
我创建了包含ViewPager. ViewPager的项目,片段,产生一些需要在托管片段中处理的事件。由于托管片段应该是一个独立的组件,因此我想Activity从通信过程中省略。
在这种情况下,注册听众的最佳地点是什么?
我们的解决方案是将您链接到的模式从“与我的活动沟通”推广到“与我的父母沟通”,这可以是一个活动或另一个片段。
\n\n我们并不总是期望 Activity 实现一个接口并将其转换为onAttach,而是使用一个实用方法来查找当前片段的有效回调,并在我们想要调用回调的地方使用它。
/**\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}\nRun Code Online (Sandbox Code Playgroud)\n\n这表示:给定一些片段和接口回调类型,我拥有的片段是否实现该接口?如果是这样就用那个。如果没有,我的 Activity 是否实现了该接口?如果是这样,请使用它。本质上,我们沿着层次结构向上寻找处理程序。
\n\n所以在你的孩子片段中:
\n\nprivate void invokeListener() {\n Listener listener = getListener(this, Listener.class);\n if (listener != null) {\n listener.onThingHappened();\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n然后在你的父片段中:
\n\npublic class ParentFragment extends Fragment implements Listener {\n @Override\n public void onThingHappened() {\n // Handle view pager fragment event\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n如果您稍后创建子级的实例并将其添加到 Activity,只需让该 Activity 实现回调,它就可以工作\xe2\x84\xa2。
\n\n希望有帮助!
\n