主机片段和 ViewPager 片段项之间的通信



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

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

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

我们的解决方案是将您链接到的模式从"与我的活动通信"推广到"与我的父母通信",这可能是一个活动或其他片段。

而不是总是期望 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;
}

这说明:给定某个片段和一个接口回调类型,我拥有的片段是否实现了该接口?如果是这样,请使用它。如果没有,我的活动是否实现了该接口?如果是这样,请使用它。从本质上讲,我们沿着层次结构向上走,寻找处理程序。

所以在你的孩子片段中:

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 实现回调,它就可以工作™了。

希望对您有所帮助!

最新更新