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
实现接口但不会收到任何更新。
您应该使用 getParentFragment
从 FragmentA
访问 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)在片段之间传递数据的信息
我有一个 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
实现接口但不会收到任何更新。
您应该使用 getParentFragment
从 FragmentA
访问 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)在片段之间传递数据的信息