【问题标题】:One or multiple interfaces?一个接口还是多个接口?
【发布时间】:2015-09-16 10:04:10
【问题描述】:

我有一个Activity A,其中包含一个Fragment B,其中另一个Fragment C 包含一个包含一些列表项的ListView

列表项如何与Activity 通信?我必须逐级通过Activity 参考,直到它到达列表项吗?我必须创建多个接口并让通信逐级引导回Activity吗?

更新:

阅读@Barend的回答后,这是我的代码:Fragment C 有一个接口CFragment B 有一个接口B,它扩展了CActivity A实现了B,也就是说它也实现了C中的方法。在Fragment C 中,我有一个mListener 字段,在onAttach(Context) 生命周期回调中分配给getActivity()

【问题讨论】:

  • 您可以在活动中使用BroadCastReceiver 作为内部类。即当单击列表项时,发送接收者可以收听的广播,如果您想使用接口,则必须创建一个频道,即通过创建多个接口
  • 这对你有帮助simpledeveloper.com/…
  • @SatyenUdeshi 感谢您的评论。它使事情更清楚。

标签: android listview android-fragments android-listview fragment


【解决方案1】:

如果你想要最干净的面向对象结构,你可以使用多个接口,为回调接口提供与片段相同的嵌套结构,如下所示:

public class InnerFragment extends Fragment {

    public interface Callback {
        // Defines all callback methods required by inner fragment
    }
}

public class OuterFragment extends Fragment {

    public interface Callback
            extends InnerFragment.Callback {
        // Defines all callback methods required by outer fragment
        // Inherits all callback methods required by inner fragment
    }
}

public class HostActivity extends Activity
        implements OuterFragment.Callback {

    // implements the callback methods of both fragments, but
    // references only the outer fragment
}

您付出的代价是,与使用广播接收器或事件总线相比,这会让您编写更多代码。

为什么这是最干净的方法?关注点分离和最少知识原则。该活动仅与外部片段直接交互;内部片段是外部片段的实现细节。

要使内部片段工作,活动必须实现内部回调。这是通过使外部回调扩展内部回调来实现的。

如果您绘制“组件 x 了解组件 y”图表,您会得到:

Activity --> OuterFragment --> InnerFragment

这很干净。这些组件是自包含的独立的,它们的依赖是显式和(大部分)编译器检查。 InnerFragment 是外部片段的“黑匣子”实现细节,它可以直接在不同的上下文中使用,如果回调不改变(它们可能从一个片段的回调移动到其他情况下)。

如果你不使用回调扩展回调技巧,你会得到这个组件知识图:

Activity --> OuterFragment --> InnerFragment
         --------------------> InnerFragment

在这种情况下,内部片段回调依赖对程序员是不可见的。如果您包含片段 X,您希望必须实现 X.Callback,但您还需要 Y.Callback 并不明显。由于这通常由 Fragment 的 onAttach() 方法中的类型转换实现,因此在运行时获取 ClassCastException 之前您不会发现。


顺便说一句,我不喜欢嵌套片段(DialogFragment 很好,但我对嵌套常规片段持怀疑态度)。我认为片段增加了非常多的复杂性,而且我还没有真正遇到过这样的情况,因为移动应用程序的小屏幕尺寸和单一任务焦点是必需的,甚至是可以原谅的。通常最好使用自定义ViewGroup。我建议仅使用片段作为支持手机堆叠布局的一种方式,在平板电脑上使用并排布局,甚至可以使用自定义ViewGroups 以通常更简单但公认不太常见的方式实现。

【讨论】:

  • 我推荐使用 getParentFragment(与 getChildFragmentManager() 配合使用)和 getTargetFragment(与 DialogFragment 配合使用)。在我的例子中,如果第一个 Fragment 没有做太多,我会把它的 UI 放到 Activity 中。
  • @Barend:我理解您答案的最后一部分(另一部分)如下:如果我的内部片段 X 位于外部片段 Y 内,试图使活动实现其(X)接口,那么使用外层Fragment Y的人可能不知道他需要让Activity实现X接口。这是正确的理解吗?
【解决方案2】:

如果您需要从fragmentActivity 通信,您可以使用getActivity() 从任何嵌套的Fragment 中获取您的Activity。 如果您需要从Activity 访问Fragment,请使用FragmentManager

FragmentManager manager = getFragmentManager();
Fragment f = manager.findFragmentByTag("Your fragment tag");

【讨论】:

  • 看来这会使FragmentActivity 紧密耦合。
猜你喜欢
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多