在我的应用程序中,我使用一个Activity包含一个Fragment,FragmentTabHost因此它的所有选项卡都是nested Fragments.
在Activity包含 aFragment和 的an 内部nested Fragment,我们可以使用onAttachedFragment().
但是如何获得对nested Fragmentfrom的引用FragmentTabHost?
在我的应用程序中,我使用一个Activity包含一个Fragment,FragmentTabHost因此它的所有选项卡都是nested Fragments.
在Activity包含 aFragment和 的an 内部nested Fragment,我们可以使用onAttachedFragment().
但是如何获得对nested Fragmentfrom的引用FragmentTabHost?
好吧,浏览源代码FragmentTabHost我发现当它添加一个片段选项卡时,它会分配一个标签TabSpec到 nested Fragment。
因此,要获得对此的引用,Fragment我们应该调用
getChildFragmentManager().findFragmentByTag(tabSpecTag)
我尝试了一段时间,但我被null返回了,FragmentManager因为我试图onCreateView()在添加后立即访问管理器。
同样重要的是要注意Fragment尚未选择的选项卡在 中尚不存在FragmentManager,因此也会返回null。mTabHost.setCurrentTab(index)在尝试Fragment使用FragmentManager. 它不是很干净,但它可以工作。
上述解决方案也有效,但我有一个更简单的解决方案,
@Override
public void onTabChanged(final String tabId) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mFragment = getChildFragmentManager().findFragmentByTag("Tagname");
}
},1000);
}
在这里你必须实现 FragmentTabHost.onTabChangeListener 我们在从 childFragmentManager 获取片段时保留了第二个延迟。
注意:您需要将 mFragment 转换为您使用过的片段。
我找到了一个我更喜欢的解决方案,因为它不涉及延迟执行代码(考虑到 android 硬件碎片和不同的处理器速度,这总是不确定的)。
在您的 onTabChanged() 方法中,在您尝试查找片段之前,请在与您的 tabHost 关联的片段管理器上调用 executePendingTransactions()。似乎 FragmentTabHost 源代码中有一些地方应该调用 executePendingTransactions() 但没有这样做。
每次选项卡发生一个异常更改时,这都会起作用...选择的第一个选项卡仍然返回空...在我的特定情况下,无论如何我都能够通过在 onResume 中放置一些代码来以不同的方式处理此异常。
希望这可以帮助。