Android FindFragmentByTag在FragmentTabHost中返回null

时间:2014-07-15 17:29:11

标签: android android-fragments

我正在尝试从我的fragmentTabHost中检索一个片段:

private void initView() {
    FragmentTabHost mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
    mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);

    mTabHost.addTab(mTabHost.newTabSpec("summary").setIndicator("Summary"),
            SummaryActivity.class, bundle);

    SummaryActivity summaryActivity = (SummaryActivity) getSupportFragmentManager().findFragmentByTag("summary");
    System.out.println(summaryActivity);
}

当我尝试在创建片段后立即获取片段时,会返回null 。这可能是一个线程问题。在这种情况下,我应该如何,甚至何时调用getFragmentByTag来检索我的片段?

2 个答案:

答案 0 :(得分:2)

您正在寻找的Fragment不在堆栈中。在您找回它时,它甚至没有添加/存在。

findFragmentByTag方法将查找并匹配在事务中添加的最后一个片段,如果它与所需的片段不匹配,那么它将使用历史记录中的可用列表进行搜索。最后,如果你的标签没有任何片段,它将return null

请确保先将Fragment添加到视图中。

视图应该接收片段/ tabhost以使其在生命周期中可用。

在进行tabHost查找之前,您必须将findFragmentByTag返回到视图以添加片段。

例如:

您在Fragment onCreateView,然后在充气后应将tabhost返回到视图。

onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        mTabHost = new FragmentTabHost(getActivity());
        mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.fragment1);

        mTabHost.addTab(mTabHost.newTabSpec("fragmenttag").setIndicator("Fragmenttag"),
                FragmentStackSupport.CountingFragment.class, null);

        return mTabHost;
}

然后您的Fragment可能会在后筹码中出现,您可以通过Tag取回。

答案 1 :(得分:0)

片段标记只能在片段事务处理期间设置。选项卡主机标签引用其他内容。如果在片段根视图上设置了id,请尝试使用findFragmentById()。