在多个片段之间重复使用回调接口

3
我的目标是在MainActivity中实现一个方法,用于所有我将创建的片段。它的目的是允许生成另一个片段(例如,Fragment1是一个列表视图。它回调到mainActivity以创建detailedItemFragment。这个detailedItemFragment可以反过来生成具有相同回调的片段)。
每个片段包含相同的接口描述。回调根据所需的下一个片段传递一个ID。当我尝试将第二个回调附加到onAttach()中的Activity时,问题就出现了。我得到了一个ClassCastException。
我认为这是一个关于接口的概念性问题,我没有正确地实现它。现在我将使用单独的回调。我的问题是这是否正确的做法,如果是,为什么第二个片段的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");
    }
}

我的MainActivity实现了OnItemSelected接口,并包含以下内容:
@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): 致命异常:java.lang.ClassCastException: ca.test.code.MainActivity@4244bbe0 必须实现 OnItemSelected 03-28 10:19:07.552: E/AndroidRuntime(6099): at ca.test.code.fragments.Offer1Fragment.onAttach(Offer1Fragment.java:38) 03-28 10:19:07.552: E/AndroidRuntime(6099): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:844) 03-28 10:19:07.552: E/AndroidRuntime(6099): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057) 03-28 10:19:07.552: E/AndroidRuntime(6099): at android.app.BackStackRecord.run(BackStackRecord.java:682) 03-28 10:19:07.552: E/AndroidRuntime(6099): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435) 03-28 10:19:07.552: E/AndroidRuntime(6099): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441) 03-28 10:19:07.552: E/AndroidRuntime(6099): at android.os.Handler.handleCallback(Handler.java:725) 03-28 10:19:07.552: E/AndroidRuntime(6099): at android.os.Handler.dispatchMessage(Handler.java:92) 03-28 10:19:07.552: E/AndroidRuntime(6099): at android.os.Looper.loop(Looper.java:137) 03-28 10:19:07.552: E/AndroidRuntime(6099): at android.app.ActivityThread.main(ActivityThread.java:5039)
请注意,该错误是由于 MainActivity@4244bbe0 必须实现 OnItemSelected 所引起的。

1
我建议在这里发布您代码的相关部分。 - batbrat
听起来像是一个多态问题。有代码会更好。 - Scott
1个回答

1
问题在于你在两个片段中都定义了名为 OnItemSelected 的不同接口。 因此,你的活动要么同时实现这两个接口,要么更好的方法是为两个片段创建一个接口。

这就是问题所在。创建两个同名接口,然后尝试在同一个类中实现它们是行不通的。谢谢。 - running-codebase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接