当前位置: 首页 > 知识库问答 >
问题:

Android,为什么一个Fragment不能直接调用另一个?

宗晟
2023-03-14

根据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); 
}

现在一切都很好。这种方法有什么问题?塔克斯。

共有3个答案

颜修为
2023-03-14

最后但同样重要的是,动态添加的片段很难确保两个片段同时“活着”,尤其是当涉及到嵌套片段时。片段的生命周期很难正确管理,使用直接通信假定你完全控制了这一点,这很少是真的。

我认为最好的模式是使用事件总线,如Otto或EventBus或RoboGuice的总线。

孟豪
2023-03-14

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

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

陈修诚
2023-03-14

至少有两个原因:

  • 促进碎片的分离
  • 为了避免通过将对一个片段的引用存储在另一个片段中而发生内存泄漏
 类似资料:
  • 问题内容: 我的意思是: 我用谷歌搜索,发现了这个: 表示定义接口方法的实现。但是接口没有实现,因此是不可能的。 但是,interface是100%抽象的类,抽象类可以实现接口(100%抽象的类)而无需实现其方法。将其定义为“接口”时会出现什么问题? 详细来说, 问题答案: 表示实现,当旨在声明仅提供不提供实现时。 A 100%,是功能上等同于,但它也可以实现,如果你想(在这种情况下,它不会保持1

  • 类别:账户余额 我已经把这两个类都放在Balance.java和Account tBalance.java.这两个文件都在E:/程序/MyPack. Balance.java编译没有错误但是当我编译Account tBalance.java它给出错误:找不到符号"平衡". 我无法弄清楚为什么当两个类都在同一个包中声明时? 我正在使用javac B从MyPack编译alance.javajavac

  • 我知道容器可以有其他参数,如填充或装饰,但如果我不使用这些,为什么我要使用SizedBox而不是容器? 它们之间存在性能差异?

  • 为什么我不能在英特尔x86-64汇编中直接将一个字节从内存移到64位寄存器? 例如,此代码: 印刷品: 为了使代码正常工作,我需要将寄存器r12和r13的移动字节更改为: 现在,它打印出预期内容: 我们为什么要这样做? 有更简单的方法吗? 谢谢

  • 我正在做一个函数,将删除一个实时Firebase中的记录。一个人只能通过知道生成的唯一ID来删除他们自己的记录。但是,当我想要实现要删除的时,我不能调用。有人知道我做错了什么吗?多谢了。 错误我的错误演示,变量在我的删除函数中无法识别 我的get类 我的代码

  • 我正在尝试将数据从DialogFraank发送到创建此对话框的Fraank。在目标片段中,我使用以下代码: 我还在fragment实现了我的接口: 在DialogFragment中,我使用以下代码: 并发送数据: 我还试图从这个问题中使用onActivityResult(): 接收数据: 但我没有收到数据:(((