在我的应用程序中,我使用了一个Activity
,其中Fragment
与FragmentTabHost
保持一致,因此其所有标签均为nested Fragments
。
在Activity
内容有Fragment
及其nested Fragment
的内容中,我们可能会使用onAttachedFragment()
获得对附加的引用。
但是如何从nested Fragment
获取对FragmentTabHost
的引用?
答案 0 :(得分:25)
好了,探索FragmentTabHost
的源代码我发现在添加片段标签时,它会将TabSpec
的标记分配给嵌套Fragment
。
因此,为了获得对此Fragment
的引用,我们应该调用
getChildFragmentManager().findFragmentByTag(tabSpecTag)
答案 1 :(得分:7)
我尝试了一段时间,但是我从null
返回FragmentManager
,因为我在添加后立即尝试访问onCreateView()
中的经理。
Here is a good explanation on what happened
同样重要的是要注意Fragment
中尚未选择尚未选择的FragmentManager
个标签,因此也会返回null
。在尝试使用mTabHost.setCurrentTab(index)
转到Fragment
之前,我致电FragmentManager
来解决这个问题。它不是很干净,但它有效。
答案 2 :(得分:1)
以上解决方案也有效,但我有一个更简单的解决方案,
@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转换为您使用过的片段。
答案 3 :(得分:1)
我发现了一个我更喜欢的解决方案,因为它并不涉及延迟执行代码(考虑到android硬件碎片和不同的处理器速度,总是如此)。
在onTabChanged()方法中,在尝试查找片段之前,请在与tabHost关联的片段管理器上调用executePendingTransactions()。似乎FragmentTabHost源代码中有一些地方应该调用executePendingTransactions(),但是没有这样做。
每次选项卡更改时都有效,但有一个例外...选中的第一个选项卡仍然返回null ...在我的特定情况下,我能够以不同的方式处理此异常,方法是在onResume中放入一些代码
希望这有帮助。