两个片段之间的通信是否有任何标准模式,其中一个片段托管另一个片段?本文Communicating with Other Fragments解释了如何在两个(独立的?)片段之间进行通信,其中Activity
是通信中介。然而,这种"模式"不适合我的情况。
我创建了包含ViewPager
的片段。 ViewPager
的项目,片段会产生一些需要在托管片段中处理的事件。由于托管片段应该是一个独立的组件,我想在通信过程中省略Activity
。
在这种情况下注册听众的最佳位置是什么?
答案 0 :(得分:3)
我们的解决方案是将您链接的模式概括为"与我的活动进行沟通" to"与我的父母"进行沟通,这可能是一个活动或另一个片段。
我们有一个实用程序方法,它寻找当前片段的有效回调,并在我们想要调用它的位置使用它,而不是总是期望Activity实现一个接口并将其强制转换为onAttach
。回调。
/**
* @param fragment The fragment to get the listener for.
* @param listenerClass The class of the listener to get.
* @param <T> Type of the listener to get.
* @return A listener object for the given fragment, cast from the owning parent fragment or
* Activity, or null if neither is a listener.
*/
@Nullable
public static <T> T getListener(@NonNull Fragment fragment, @NonNull Class<T> listenerClass) {
T listener = null;
if (listenerClass.isInstance(fragment.getParentFragment())) {
listener = listenerClass.cast(fragment.getParentFragment());
}
else if (listenerClass.isInstance(fragment.getActivity())) {
listener = listenerClass.cast(fragment.getActivity());
}
return listener;
}
这说:给定一些片段和接口回调类型,我的拥有片段是否实现了该接口?如果是这样的话。如果没有,我的Activity是否实现了界面?如果是这样,请使用它。从本质上讲,我们走在层次结构中寻找处理程序。
所以在你的孩子片段中:
private void invokeListener() {
Listener listener = getListener(this, Listener.class);
if (listener != null) {
listener.onThingHappened();
}
}
然后在你的父片段中:
public class ParentFragment extends Fragment implements Listener {
@Override
public void onThingHappened() {
// Handle view pager fragment event
}
}
如果您稍后创建子项的实例并将其添加到Activity,只需让该Activity实现回调,它就可以工作了。
希望有所帮助!