【问题标题】:Android, why shouldn't one Fragment call another directly?Android,为什么一个 Fragment 不能直接调用另一个 Fragment?
【发布时间】:2014-01-02 14:51:57
【问题描述】:

根据 Android 指南,http://developer.android.com/training/basics/fragments/communicating.html 一个片段应通过托管 Activity 将数据发送到另一个片段。我想知道这是有原因的。 因为在我的代码中,我放置了一个变量来保存指向另一个片段的指针,并在 onActivityCreated 中分配它

//this code is in class FragmentType1, assign the pointer to the FragmentType2 for later use
@Override
    public void onActivityCreated(final Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        final FragmentManager fm = getFragmentManager();

                mOtherFragment = (FragmentType2) fm
                .findFragmentById(R.id.container_fragment);
    }

以后如果我想为 FragmentType2 设置数据,我只需调用:

public setData(MyData data){
    if (mOtherFragment!=null)
        mOtherFragment.setData(data); 
}

现在一切正常。这种方法有什么问题?谢了。

【问题讨论】:

  • 这是因为我们正在尝试解耦事物,并且可能会在其他地方重用这些片段。

标签: android android-fragments


【解决方案1】:

至少有两个原因:

  • 便于片段解偶联。
  • 为了避免将一个片段的引用存储在另一个片段中而发生的内存泄漏。

【讨论】:

    【解决方案2】:

    另一个原因是在托管活动被销毁时保持状态。

    重新创建后,您可以从托管活动中获取状态,因为片段本身无法直接保存其状态。

    【讨论】:

      【解决方案3】:

      最后但并非最不重要的一点是,动态添加的片段确实很难确保两个片段同时“活跃”,尤其是嵌套片段时。片段生命周期很复杂,很难正确管理,使用直接通信假定您完全控制它,这很少是真的。

      在我看来,最好的模型是使用事件总线,例如 Otto 或 EventBus 或 RoboGuice 的总线。

      【讨论】:

        猜你喜欢
        • 2016-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多