我期望的目标是在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的接口。
因此,要么你的活动实现了两者,要么更好,你只需为两个活动创建一个接口

09-11 19:54