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

时间:2018-04-04 12:39:45

标签: java android circular-dependency

我有这个简单的问题:

活动包含片段。两者都希望彼此沟通。

片段想要通知活动某些交互。因此,它定义了由活动实现的OnFragmentInteractionListener接口。这已经是Android Studio片段模板的一部分,所以这里没什么新内容。

活动想要通知片段有关按下后退按钮的信息。因此,它定义了由片段实现的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);
    }
}
恕我直言,这是一个简单的设计,不幸的是,它不起作用。 "循环遗传涉及......"是来自Android Studio的消息。

如果我使用嵌套类而不是接口作为类'我会期望编译错误。静态初始化程序可能是循环相互依赖的。我没有看到界面的问题,但我确信这是一个很好的理由,为什么它不被允许。

解决此问题的最简单方法是使其中一个接口成为包级接口。但我想知道这是否可行。如果是这样的话:哪一个应该是包级别的。

1 个答案:

答案 0 :(得分:1)

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

如果您打算与UI进行交互,或者它会导致异常,请不要忘记在onStop或onPause中取消注册侦听器。

现在简单的方法是,覆盖活动中的onBackPressed,当它被击中时,广播一个事件并让你的片段知道。简单而且不应该处理太多问题。

我个人更喜欢这种方法向我的所有片段发送消息。你自己说的另一种方法是声明一个包广泛的界面,并按照你已经写的那样做你想要的东西。这也没有错,它只是Java是Java。