我们应该使用setTargetFragment()吗?我认为碎片不应该相互通信

时间:2013-09-22 16:14:39

标签: android android-fragments android-activity android-dialogfragment

android开发人员教程建议我使用片段的主机活动来传递数据和诸如此类的东西,那么为什么会有一个set / get目标片段方法呢?

我的应用程序到目前为止包含一个主机活动和一个片段,它有一个启动DialogFragment的按钮,其中有一个按钮可以启动另一个DialogFragment。使用setTargetFragment/getTargetFragment使整个考验变得有些混乱,所以我想重新实现让我的主要活动通过我的主片段的自定义界面处理DialogFragment.show方法。

这是正确的思维方式吗?或者使用setTargetFragment没有害处?任何人都可以提供使用它的好的和坏的例子吗?

2 个答案:

答案 0 :(得分:6)

此外,您最终可能会在片段管理器中找不到目标片段。如果在轮换(或其他配置更改)之后,当调用者片段将添加时,目标片段将不会被读取到片段管理器,则会发生这种情况。

想象一下,你有一些确认片段,你可以从MainFragment中添加:

ConfirmationFragment frag = new ConfirmationFragment();
frag.setTargetFragment(this, 0);
getFragmentManager().beginFragmentTransaction().add(R.id.container, frag).commit(); 

现在点击某个确认按钮,您可以通过调用{/ p>来调用MainFragment中的方法

((MainFragment)this.getTargetFragment()).onUserSelectedGoodButton();

这非常简单,但是如果您要旋转屏幕,并且出于某种原因ConfirmationFragmentFragmentManager添加到MainFragment {{1}}之前,则会抛出异常,说明目标片段在片段管理器中找不到

答案 1 :(得分:4)

我不认为使用setTargetFragment存在隐含的危害,但是,我只会在非常具体的情况下使用它。例如,如果目标片段只是 将被片段使用(考虑到对象重用并设计可以在可能的情况下重用的类),即使这样,也要谨慎。

通过使用它们太多,你最终会得到你所看到的东西 - 令人困惑的代码很难遵循和维护。首先,通过整个活动整理所有内容,您可以保持一个易于遵循和维护的“扁平”层次结构。

我认为使用setTargetFragment或不使用setTargetFragment的决定是一种编码风格/哲学决策,凭借智慧和经验,它“感觉”是对还是错。也许就你的情况而言,有证据表明你正在质疑你的旧代码,你正在获得这种智慧:)