Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 主机片段和ViewPager片段项之间的通信_Android_Android Fragments - Fatal编程技术网

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

Android 主机片段和ViewPager片段项之间的通信,android,android-fragments,Android,Android Fragments,在一个片段承载另一个片段的情况下,两个片段之间是否有任何标准的通信模式?这篇文章解释了如何在两个独立的用户之间进行通信?活动是通信中介的片段。然而,这种模式不适合我的情况 我已经创建了包含ViewPager的片段。ViewPager的项fragments产生一些需要在宿主fragment中处理的事件。因为托管片段应该是一个独立的组件,所以我想从通信过程中删除OMIT活动 在这种情况下,注册侦听器的最佳位置是什么?我们的解决方案是将链接到的模式从“与我的活动通信”推广到“与我的家长通信”,这可能是

在一个片段承载另一个片段的情况下,两个片段之间是否有任何标准的通信模式?这篇文章解释了如何在两个独立的用户之间进行通信?活动是通信中介的片段。然而,这种模式不适合我的情况

我已经创建了包含ViewPager的片段。ViewPager的项fragments产生一些需要在宿主fragment中处理的事件。因为托管片段应该是一个独立的组件,所以我想从通信过程中删除OMIT活动


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

我们的解决方案是将链接到的模式从“与我的活动通信”推广到“与我的家长通信”,这可能是一个活动或另一个片段

我们没有总是期望活动实现一个接口并在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
    }
}
如果您稍后创建子对象的实例并将其添加到活动中,只需让该活动实现回调即可™.


希望有帮助

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

我们没有总是期望活动实现一个接口并在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
    }
}
如果您稍后创建子对象的实例并将其添加到活动中,只需让该活动实现回调即可™.


希望有帮助

完美的解决方案!完美的解决方案!