主机片段和ViewPager的片段项

时间:2017-07-13 19:40:45

标签: android android-fragments

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

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

在这种情况下注册听众的最佳位置是什么?

1 个答案:

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

希望有所帮助!