我有一个带有MainActivity的应用程序,带有导航抽屉菜单。
在MainActivity View中,我有一个Frame布局,占据了整个空间。
当用户从menù中选择一些东西时,我调用一个方法来处理Frame Layout中的片段事务。
我的MainActivity是片段管理器,从这里我可以处理我想要的所有更改,我可以处理片段之间的通信。
问题在于:
在我的一个片段中,我想要显示2个新片段,一个带有PieChart,另一个带有数据。
我本可以只在其视图中完成一个片段,但我想使用模块化管理方式。
所以,首先我创建了一个片段,即容器一个(我们可以称之为A)。
在其视图中,我将片段B和片段C直接放在Xml中。
在片段B中我得到了PieChart,在这里我调用了从数据库下载数据的方法,然后我把这些数据放在图表中。
我写了一个简单的接口,其中包含一个方法,当用户与图表交互时调用该方法;它用所选数据构建一个对象。
我的目标是将这些数据发送到片段A,然后将它们传递给片段C,以便用户可以看到他选择的是什么。
在Fragment A中我实现了Fragment B接口,然后我在B的OnAttach中设置了这个代码:
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
Interface = (InterfaceB) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString()
+ " must implement InterfaceB");
}
}
Everithing似乎有效,但是在创建片段A的那一刻,B的OnAttach被调用,到达的上下文指的是MainActivity,而不是片段A.
这会导致崩溃。
答案 0 :(得分:1)
Fragment不是Context的实例,因此无论如何都不可能将它传递给onAttach(Context Context)。
有两种方法可以做你想做的事。
1)在片段A中使用onAttachFragment(Fragment fragment),并在附加片段B和C时捕获事件;
2)在片段B和C中使用getParentFragment()来访问A.