安卓嵌套片段和界面



我有一个片段A,它有一个接口,它将返回文本视图的值。片段 A 已初始化并附加到片段 B。下面是片段 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)

主活动包含片段 B,但片段 B 已经实现了片段 A 的接口。为什么会发生错误?父片段中实现的接口不起作用?

来自Android Developer网站,它说:

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

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

因此,当您在片段 B 中实现该接口时,它会引发运行时异常错误。

摘要:您必须在片段托管活动中实现该接口。

您可以在以下位置了解有关如何通过托管活动(通常我们使用 Bundle(在片段之间传递数据的更多信息 http://www.vogella.com/tutorials/AndroidFragments/article.html

错误消息非常清楚。当你使用onAttach时,传递context实际上是主机Activity——最大的老板,而不是父片段。因此,FragmentB实现接口但不会收到任何更新。

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

最新更新