基于来自http://developer.android.com/training/basics/fragments/communicating.html的示例,我试图重现两个片段之间的通信,这两个片段是较大片段的子片段。
在示例中,AB 活动包含 A 片段和 B 片段。但我试图达到同样的效果,但在我的情况下 AB 片段包含 A 片段和 B 片段。
问题是 AB 片段中的覆盖方法永远不会被调用。这是否不起作用,因为包含组件是片段而不是示例中的活动?我在这里错过了什么吗?
基于来自http://developer.android.com/training/basics/fragments/communicating.html的示例,我试图重现两个片段之间的通信,这两个片段是较大片段的子片段。
在示例中,AB 活动包含 A 片段和 B 片段。但我试图达到同样的效果,但在我的情况下 AB 片段包含 A 片段和 B 片段。
问题是 AB 片段中的覆盖方法永远不会被调用。这是否不起作用,因为包含组件是片段而不是示例中的活动?我在这里错过了什么吗?
如果您指的是onClick()
或其他一些onSomething()
处理程序,那么这些总是在Activity
类中调用,而不是在片段中。因此,在您链接的示例中,即使您有嵌套片段,也onArticleSelected()
必须保留在 中。Activity
要将信息传递给片段,您有几个选择。一,您可以在活动中保留对片段的引用。如果您的活动重新创建(例如设置事件),这可能会丢失。
第二种更好的方法是标记您的片段,然后使用findFragmentByTag
.
当你添加你的片段时(注意参数“my_fragment”,这是我给片段的标签):
getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, myFragment, "my_fragment").commit();
或者当您将一个片段替换为另一个片段时:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment, "my_fragment").comit();
然后,当您想在onArticleSelected
活动中的片段中执行某些操作时:
Fragment fragment = getSupportFragmentManger().findFragmentByTag("my_fragment");
if (fragment != null) {
fragment.articleSelected(articleId);
}
您始终可以使用 anInterface
在片段之间进行通信。这是最安全的方法。