Android 主机片段和ViewPager片段项之间的通信
在一个片段承载另一个片段的情况下,两个片段之间是否有任何标准的通信模式?这篇文章解释了如何在两个独立的用户之间进行通信?活动是通信中介的片段。然而,这种模式不适合我的情况 我已经创建了包含ViewPager的片段。ViewPager的项fragments产生一些需要在宿主fragment中处理的事件。因为托管片段应该是一个独立的组件,所以我想从通信过程中删除OMIT活动Android 主机片段和ViewPager片段项之间的通信,android,android-fragments,Android,Android Fragments,在一个片段承载另一个片段的情况下,两个片段之间是否有任何标准的通信模式?这篇文章解释了如何在两个独立的用户之间进行通信?活动是通信中介的片段。然而,这种模式不适合我的情况 我已经创建了包含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
}
}
如果您稍后创建子对象的实例并将其添加到活动中,只需让该活动实现回调即可™.
希望有帮助 完美的解决方案!完美的解决方案!