我期望的目标是在main活动中为我要创建的所有片段都有一个实现的方法。它的目的是允许生成另一个片段(例如,fragment1是一个列表视图)。它调用main活动来创建一个detaileditemfragment。此detaileditemfragment可以依次生成具有相同回调的片段)
每个片段包含相同的接口描述。回调根据所需的下一个片段传递一个id。当我试图将第二个回调附加到onattach()中的活动时,问题就开始了。我有一个阶级例外。
我认为这是接口的一个概念性问题,而且我没有正确地实现它。现在我将使用单独的回调。我的问题是这是正确的做法,如果是这样,为什么第二个片段onattach()上有问题?
我的第一个片段是:
public class MainFragment extends Fragment implements OnClickListener {
public interface OnItemSelected {
public void launchNewFragment(FragId id);
}
private OnItemSelected callback;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container, false);
return view;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
callback = (OnItemSelected) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnItemSelected");
}
}
我的第二个片段是:
public class Offer1Fragment extends Fragment implements OnClickListener {
public interface OnItemSelected {
public void launchNewFragment(FragId id);
}
private OnItemSelected callback;
private Context context;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_offer1, container, false);
context = getActivity();
return view;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
callback = (OnItemSelected) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnItemSelected");
}
}
我的主活动实现了OnElected并包含以下内容:
@Override
public void launchNewFragment(FragId id) {
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
Fragment fragment = null;
switch(id) {
case Offer1:
fragment = new Offer1Fragment();
break;
//Other fragment ids are used to instantiate here as well
}
fragmentTransaction.replace(android.R.id.content, fragment);
fragmentTransaction.commit();
}
错误块为:
03-28 10:19:07.552:e/androidruntime(6099):致命异常:main
03-28 10:19:07.552:e/androidruntime(6099):java.lang.classcastexception:ca.test.code.mainActivity@4244bb00必须实现OnTimeSelected
03-28 10:19: 7.552:E/ANDROIDRunTIME(6099):AT CA测试。代码。
03-28 10:19: 7.552:E/ANDROIDRunTime:(6099):在安卓.App.FractMaungIrl IMP.MOVETSTATE(碎片管理器:Java:844)
03-28 10:19: 7.552:E/ANDROIDRunTime:(6099):在安卓.App.FractMaungIrl IMP.MOVETSTATE(碎片管理器:Java:1057)
03-28 10:19: 7.552:E/ANDROIDRunTime:(6099):在Android .App.BuffStActReavest.Run(BuffStActReava. java:682)
第7.552号:E(6099):在安卓(1435)
03-28 10:19: 7.552:E/ANDROIDRunTime:(6099):在Android .App.FractMaungErrl IMPL 1美元上运行(片段管理器:Java:441)
03-28 10:19: 7.552:E/ANDROIDRunTime:(6099):在安卓.OS.HuntReal.AutoLeCalBead(HANDL.java:725)
03-28 10:19: 7.552:E/ANDROIDRunTime:(6099):在Android .OS.Halder-Debug Chrime:HANDL.java:92)
03-28 10:19: 7.552:E/ANDROIDRunTIME(6099):在安卓.OS.Looper-Loor(Looper-Java:137)
03-28 10:19: 7.552:E/ANDROIDRunTime:(6099):在安卓.App.ActuviyTrime.Mead(ActuviyTo.java:5039)
最佳答案
问题是您在两个片段中都定义了两个不同的名为onitemselected的接口。
因此,要么你的活动实现了两者,要么更好,你只需为两个活动创建一个接口