提问者:小点点

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


Android开发人员教程建议我使用片段的主机活动来传递数据等等,那么为什么会有一个设置/获取目标片段的方法呢?

到目前为止,我的应用程序包含一个宿主活动和一个片段,其中有一个按钮可以启动一个对话片段,其中有一个按钮可以启动另一个对话片段。使用setTargetFrament/getTargetFrament让整个磨难有些混乱,所以我正在考虑重新实现,让我的主要活动通过我的主要片段的自定义界面处理DialogFragment.show方法。

这是正确的思维方式吗?还是使用设置目标碎片没有害处?任何人都可以提供使用它的好例子和坏例子吗?


共2个答案

匿名用户

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

假设您有某种从MainFragment添加的确认片段:

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

现在在某个确认按钮上,单击您通过调用从MainFrament调用方法:

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

这很漂亮也很简单,但是如果你要转屏,并且由于某种原因ConfirmationFrament将被添加到FragmentManager之前的MainFrament,将引发异常,说明在片段管理器中找不到目标片段

匿名用户

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

过多地使用它们,你最终会看到混乱的代码,难以理解和维护。从一开始,通过整理活动中的一切,你就保持了一个易于遵循和维护的“扁平”层次结构。

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