【问题标题】:How to communicate between fragments in a deep nested chain?如何在深层嵌套链中的片段之间进行通信?
【发布时间】:2016-05-04 04:47:01
【问题描述】:

我正在努力更好地理解接口、活动和片段之间的相互作用。

根据this link from the Android documentation

通常你会希望一个 Fragment 与另一个 Fragment 进行通信,因为 基于用户事件更改内容的示例。全部 片段到片段的通信是通过关联的 活动。两个 Fragment 永远不应该直接通信。

他们举了这个例子:

public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;

    // Container Activity must implement this interface
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }

    ...
}

如果您正在处理嵌套的片段链,这将如何改变?

例如,假设我有一个 Activity,它包含一个 Fragment,然后该 Fragment 包含另一个 Fragment,等等。明确地说:

Activity --> Fragment1 --> Fragment2 --> Fragment3 --> Fragment4 --> Fragment5

我正在尝试了解执行以下操作的公认最佳做法:

假设 Fragment5 有一个 EditText 和一个附有 OnClickListener 的 Button。我按下按钮,EditText 的内容以某种方式发送到 Fragment3 中的函数。

我的问题:

我假设我们需要在 Fragment5 中定义一个接口/侦听器,就像上面的示例一样,这意味着前面的 Activity 方式应该实现该接口,因为根据文档,活动应该在之间传递信息片段。

但是现在,从这个Activity中,我们如何将信息传递给Fragment3呢?

【问题讨论】:

  • 使用Bundle 来传输数据,当你用新片段替换旧片段时setArguments会帮助你。
  • @AnshulTyagi 这与我的问题无关——我不是在问工厂模式。我在问你如何将一个孩子的信息传递给几个父母。
  • 可以使用 Otto 等第三方库

标签: java android android-fragments android-activity interface


【解决方案1】:

该文档说的是兄弟片段到片段的通信。他们应该通过父活动进行交流。

子fragment到父fragment的通信,可以直接通信。

((ParentFragment) getParentFragment ).doSomething();

你可以有一个接口,让父片段实现它。那么子fragment就可以通过接口与父fragment进行通信,而无需直接与另一个fragment通信。

【讨论】:

  • 但这是否意味着子片段假设它被父片段(而不是父活动)包含,违反了模块化原则?
  • 对于兄弟父母,Activity 控制片段。 Activity 是所有兄弟片段的直接父级。所以我们可以将数据从一个片段路由到另一个片段。在嵌套片段的情况下是不可行的。 Activity 不知道它的子片段的子片段。
【解决方案2】:

有很多方法我更喜欢LocalBroadcastManager

【讨论】:

    猜你喜欢
    • 2013-08-14
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多