在我的应用程序中,我使用一个Activity
包含一个Fragment
,FragmentTabHost
因此它的所有选项卡都是nested Fragments
.
在Activity
包含 aFragment
和 的an 内部nested Fragment
,我们可以使用onAttachedFragment()
.
但是如何获得对nested Fragment
from的引用FragmentTabHost
?
在我的应用程序中,我使用一个Activity
包含一个Fragment
,FragmentTabHost
因此它的所有选项卡都是nested Fragments
.
在Activity
包含 aFragment
和 的an 内部nested Fragment
,我们可以使用onAttachedFragment()
.
但是如何获得对nested Fragment
from的引用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 中放置一些代码来以不同的方式处理此异常。
希望这可以帮助。