android - 跨多个 fragment 重用回调接口(interface)

标签 android android-fragments interface callback fragment

我期望的目标是在 MainActivity 中为我将要创建的所有 fragment 实现一个方法。它的目的是允许生成另一个 fragment (例如 Fragment1 是一个 ListView 。它回调到 mainActivity 以创建一个 detailedItemFragment。这个 detailedItemFragment 可以反过来生成一个具有相同回调的 fragment )

每个 fragment 都包含相同的接口(interface)描述。回调根据所需的下一个 fragment 传递一个 Id。当我尝试将第二个回调附加到 onAttach() 中的 Activity 时,我的问题就开始了。我得到一个 ClassCastException。

我认为这是接口(interface)的概念性问题,我没有正确实现它。现在我将使用单独的回调。我的问题是这是正确的做法吗?如果是这样,为什么第二个 fragment onAttach() 会出现问题?

我的第一个 fragment 是:

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");
    }
}

我的第二个 fragment 是:

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();

}

错误 block 是:

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@4244bbe0 必须实现 OnItemSelected 03-28 10:19:07.552:E/AndroidRuntime(6099):在 ca.test.code.fragments.Offer1Fragment.onAttach(Offer1Fragment.java:38) 03-28 10:19:07.552: E/AndroidRuntime(6099): 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:844) 03-28 10:19:07.552: E/AndroidRuntime (6099): 在 android.app.FragmentManagerImpl.moveToState (FragmentManager.java:1057) 03-28 10:19:07.552: E/AndroidRuntime (6099): 在 android.app.BackStackRecord.run (BackStackRecord.java:682) 03-28 10:19:07.552: E/AndroidRuntime (6099): 在 android.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1435) 03-28 10:19:07.552: E/AndroidRuntime(6099): 在 android.app.FragmentManagerImpl$1.run(FragmentManager.java:441) 03-28 10:19:07.552: E/AndroidRuntime (6099): 在 android.os.Handler.handleCallback (Handler.java:725) 03-28 10:19:07.552: E/AndroidRuntime (6099): 在 android.os.Handler.dispatchMessage (Handler.java:92) 03-28 10:19:07.552: E/AndroidRuntime(6099): 在 android.os.Looper.loop(Looper.java:137) 03-28 10:19:07.552: E/AndroidRuntime(6099): 在 android.app.ActivityThread.main(ActivityThread.java:5039)

最佳答案

问题是您在两个 fragment 中定义了两个名为 OnItemSelected 的不同接口(interface)。 因此,要么您的 Activity 实现两者,要么更好,您只需为这两个 Activity 创建一个接口(interface)

关于android - 跨多个 fragment 重用回调接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22716156/

相关文章:

android - 制作线程循环的最佳方法?

android - Proguard 中的自定义混淆类名

android - location.getspeed() 更新

java - 如何在 DialogFragment 的 textView 中 setText()

android - 如何将Activity转为Fragment,使用ViewPager实现滑动?

go - 使用指针和值接收器构造类型实例

c#-4.0 - 通用接口(interface)的通用抽象基类

android - 我可以在 ContentResolver 列查询上运行 SQL 函数吗?

c# - 静态成员和接口(interface)

java - 在 Android 中的 Fragment 中绘图