18

在我的应用程序中,我使用一个Activity包含一个FragmentFragmentTabHost因此它的所有选项卡都是nested Fragments.

Activity包含 aFragment和 的an 内部nested Fragment,我们可以使用onAttachedFragment().

但是如何获得对nested Fragmentfrom的引用FragmentTabHost

4

4 回答 4

26

好吧,浏览源代码FragmentTabHost我发现当它添加一个片段选项卡时,它会分配一个标签TabSpec到 nested Fragment

因此,要获得对此的引用,Fragment我们应该调用

getChildFragmentManager().findFragmentByTag(tabSpecTag)

于 2013-04-09T10:50:27.113 回答
7

我尝试了一段时间,但我被null返回了,FragmentManager因为我试图onCreateView()在添加后立即访问管理器。

这是对发生的事情的一个很好的解释

同样重要的是要注意Fragment尚未选择的选项卡在 中尚不存在FragmentManager,因此也会返回nullmTabHost.setCurrentTab(index)在尝试Fragment使用FragmentManager. 它不是很干净,但它可以工作。

于 2013-04-09T22:56:33.900 回答
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 转换为您使用过的片段。

于 2014-11-19T19:17:40.590 回答
1

我找到了一个我更喜欢的解决方案,因为它不涉及延迟执行代码(考虑到 android 硬件碎片和不同的处理器速度,这总是不确定的)。

在您的 onTabChanged() 方法中,在您尝试查找片段之前,请在与您的 tabHost 关联的片段管理器上调用 executePendingTransactions()。似乎 FragmentTabHost 源代码中有一些地方应该调用 executePendingTransactions() 但没有这样做。

每次选项卡发生一个异常更改时,这都会起作用...选择的第一个选项卡仍然返回空...在我的特定情况下,无论如何我都能够通过在 onResume 中放置一些代码来以不同的方式处理此异常。

希望这可以帮助。

于 2015-02-05T19:57:34.617 回答