【问题标题】:Communication between host Fragment and ViewPager's Fragment item宿主 Fragment 和 ViewPager Fragment 项之间的通信
【发布时间】:2017-07-13 19:40:45
【问题描述】:

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

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

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

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

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

    我们并不总是期望 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 实现回调,它就可以正常工作了™。

    希望有帮助!

    【讨论】:

    • 完美解决方案!
    猜你喜欢
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    相关资源
    最近更新 更多