从FragmentTabHost获取对嵌套片段的引用

时间:2013-04-09 09:26:17

标签: android android-fragments android-tabhost android-nested-fragment

在我的应用程序中,我使用了一个Activity,其中FragmentFragmentTabHost保持一致,因此其所有标签均为nested Fragments

Activity内容有Fragment及其nested Fragment的内容中,我们可能会使用onAttachedFragment()获得对附加的引用。

但是如何从nested Fragment获取对FragmentTabHost的引用?

4 个答案:

答案 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中放入一些代码

希望这有帮助。