我有这个简单的问题:
活动包含片段。两者都希望彼此沟通。
片段想要通知活动某些交互。因此,它定义了由活动实现的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的消息。
如果我使用嵌套类而不是接口作为类'我会期望编译错误。静态初始化程序可能是循环相互依赖的。我没有看到界面的问题,但我确信这是一个很好的理由,为什么它不被允许。
解决此问题的最简单方法是使其中一个接口成为包级接口。但我想知道这是否可行。如果是这样的话:哪一个应该是包级别的。
答案 0 :(得分:1)
您可以使用注册调用将一个BroadcastListener附加到Fragment。
如果您打算与UI进行交互,或者它会导致异常,请不要忘记在onStop或onPause中取消注册侦听器。
现在简单的方法是,覆盖活动中的onBackPressed,当它被击中时,广播一个事件并让你的片段知道。简单而且不应该处理太多问题。
我个人更喜欢这种方法向我的所有片段发送消息。你自己说的另一种方法是声明一个包广泛的界面,并按照你已经写的那样做你想要的东西。这也没有错,它只是Java是Java。