我们的解决方案是将您链接到的模式从“与我的活动沟通”概括为“与我的父母沟通”,这可能是一个活动或另一个片段。
我们并不总是期望 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 实现回调,它就可以正常工作了™。
希望有帮助!