Android 嵌套片段和界面

Android Nested Fragment and Interface

我有一个 Fragment A,它的界面将 return TextView 的值。 Fragment A 已初始化并附加到 FragmentB。这是片段 A 和 B 的代码。

片段 A

public class FragmentA extends Fragment {
    ...

    public interface Listener {
       void onValue(int value);
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof Listener) {
            listener = (Listener) context;
        } else {
            throw new RuntimeException(context.toString() + " must implement Listener");
        }
    }
}

片段 B

public class FragmentB extends Fragment implements FragmentA.Listener {    
    ...

    private void initFragmentA() {
        FragmentManager fragmentManager = getChildFragmentManager();
        fragmentA = FragmentA.newInstance();
        fragmentManager.beginTransaction().add(container, fragmentA, TAG).commit();
    }

    @Override
    public void onValue(int value) {

    }
}

当我启动应用程序时,出现错误:

Java.lang.RuntimeException: ####.page.MainActivity@1f7f316c must implement Listener 
    at ####.widget.FragmentA.onAttach(FragmentA.java:66)

MainActivity包含Fragment B,但是Fragment B已经实现了Fragment A的接口,为什么会报错?父Fragment中实现的接口不起作用?

错误信息很清楚。当您使用 onAttach 时,传递的 context 实际上是宿主 Activity - 最大的 boss,而不是父片段。所以 FragmentB 实现接口但不会收到任何更新。

您应该使用 getParentFragmentFragmentA 访问 FragmentB,然后将其转换为 Listener 接口。

来自 Android Developer website,它说:

通常您会希望一个 Fragment 与另一个 Fragment 进行通信,例如根据用户事件更改内容。所有片段到片段的通信都是通过关联的 Activity 完成的。两个 Fragment 不应该直接通信。

要允许 Fragment 与其 Activity 通信,您可以在 Fragment class 中定义一个接口并在 Activity 中实现它。片段在其 onAttach() 生命周期方法期间捕获接口实现,然后可以调用接口方法以便与 Activity.

进行通信

因此,当您在片段 B 中实现该接口时,它会抛出 RuntimeException 错误。

总结:您必须在片段托管中实现该接口 activity。

您可以在 http://www.vogella.com/tutorials/AndroidFragments/article.html

了解更多有关如何通过托管 activity(通常我们使用 Bundle)在片段之间传递数据的信息