【问题标题】:Should we be using setTargetFragment()? I thought Fragments should not be communicating with each other我们应该使用 setTargetFragment() 吗?我认为片段不应该相互交流
【发布时间】:2013-09-22 16:14:39
【问题描述】:

android开发者教程推荐我使用fragment的宿主activity来传递数据什么的,那么为什么会有set/get target fragment的方法呢?

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

这是正确的思维方式吗?或者使用setTargetFragment 没有坏处?谁能提供使用它的好坏例子?

【问题讨论】:

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


    【解决方案1】:

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

    假设您有某种从MainFragment 添加的确认片段,如下所示:

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

    现在点击某个确认按钮,您可以通过调用从MainFragment 调用一个方法:

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

    这很漂亮也很简单,但是如果你旋转屏幕并且由于某种原因将ConfirmationFragment添加到FragmentManager之前MainFragment,则会抛出异常,说明在片段中找不到目标片段经理

    【讨论】:

    • 您所要做的就是将目标片段保存在 onSaveInstanceState - 如果 savedInstance 为 != null,您可以在 onCreate 中检索它。我依稀记得曾经读过,如果你替换一个片段可能会出现问题,而不是隐藏原始片段并在其上添加新片段。
    • @AgentKnopf “将目标片段保存在 onSaveInstanceState 中”?这是什么意思? “保存”片段是片段管理器的工作。我以前从未听说有人试图“保存”一个片段。对话框永远不会重新创建它的调用者。
    • 创建对话框时只需要使用调用者/targetfragment的子fragmentmanager即可。然后你可以随心所欲地旋转——不会抛出任何异常。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我想我的直觉告诉我是对的。感谢您的建议。我现在开始重新实现...:P
    • 如果您通过回调接口使用 setTargetFragment,您不会将片段相互耦合 - 但是如果您转换为特定的片段,那么我会认为这是一个坏主意,因为它引入了紧密耦合。跨度>
    猜你喜欢
    • 1970-01-01
    • 2017-06-13
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多