解决 Activity 和 Fragment 之间循环依赖的最佳方法

Best way to resolve cyclic dependency between Activity and Fragment

我有这个简单的问题:

activity 包含一个片段。双方都想相互交流。

该片段想要通知 activity 有关某些交互的信息。因此它定义了由activity 实现的OnFragmentInteractionListener 接口。这已经是 Android Studio 片段模板的一部分,因此这里没有新内容。

activity 想要通知片段有关按下后退按钮的信息。因此它定义了由片段实现的 OnBackPressedListener 接口。

class MainActivity extends AppCompatActivity implements MyFragment.OnFragmentInteractionListener {

    ...

    @Override
    public void onFragmentInteraction(Uri uri) {
        ...
    }

    interface OnBackPressedListener {
        boolean onBackPressed();
    }
}

class MyFragment extends Fragment implements MainActivity.OnBackPressedListener {

    ...

    @Override
    public boolean onBackPressed() {
        ...
    }

    interface OnFragmentInteractionListener {
        void onFragmentInteraction(Uri uri);
    }
}

恕我直言,一个简单的设计,不幸的是,它不起作用。 "Cyclic inheritance involving ..." 是来自 Android Studio 的消息。

如果我使用嵌套 类 而不是接口,我会预料到编译错误,因为 类' 静态初始值设定项可能相互循环依赖。我没有看到接口有这个问题,但我确信这是不允许的。

解决此问题的最简单方法是将其中一个接口设为包级接口。但我想知道这是否是要走的路。如果是这样:哪个应该是包级的。

您可以使用注册调用将 BroadcastListener 附加到 Fragment。

如果您打算与 UI 交互,请不要忘记在 onStop 或 onPause 中注销监听器,否则会导致异常。

现在简单的方法是,覆盖 activity 中的 onBackPressed,当它被击中时,广播一个事件并让您的片段知道。简单,处理起来应该不会有太大问题。

我个人更喜欢这种向我的所有片段发送消息的方法。正如您自己所说,另一种方法是声明一个包范围的接口并按照您已经编写的方式执行您想要的操作。这也没什么问题,只是 Java 变成了 Java.