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

Ton*_*ced 9 android android-fragments android-activity android-dialogfragment

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

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

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

Max*_* Ch 6

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

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

ConfirmationFragment frag = new ConfirmationFragment();
frag.setTargetFragment(this, 0);
getFragmentManager().beginFragmentTransaction().add(R.id.container, frag).commit(); 
Run Code Online (Sandbox Code Playgroud)

现在点击一些确认按钮,你可以MainFragment通过调用来调用一个方法:

((MainFragment)this.getTargetFragment()).onUserSelectedGoodButton();
Run Code Online (Sandbox Code Playgroud)

这非常简单,但是如果您将旋转屏幕并且由于某种原因ConfirmationFragment将被添加到FragmentManager之前MainFragment,将抛出异常,说明在片段管理器中找不到目标片段


小智 4

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

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

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

  • 如果您通过回调接口使用 setTargetFragment,则不会将片段相互耦合 - 但是如果您转换为特定的片段,那么我会认为这是一个坏主意,因为它引入了紧密耦合。 (2认同)