FragmentTabHost - 在第一次查看之前,标签不可寻址

时间:2013-08-11 07:39:27

标签: android android-fragments android-tabhost

我正在使用带有多个标签的FragmentTabHost(如图所示here构建)。 但是,我无法使用getFragmentByTag(在这种情况下返回null)随机地查找我的选项卡,除非通过至少单击选项卡一次激活已解决的选项卡。

FragmentTabHost似乎延迟了标签的创建,直到我们确实需要它们(也就是用户点击它并希望查看它)。 有没有办法强制主机立即创建它们,以便我可以通过getFragmentByTag安全地访问它们?
或者是否可以“自己创建标签”并将它们添加到TabHost?

1 个答案:

答案 0 :(得分:5)

  

有没有办法强制主机立即创建它们,以便我可以通过getFragmentByTag安全地访问它们?

没有。因为交易是在onAttachedToWindow()执行的。我们来看看source code

@Override
protected void onAttachedToWindow() {
    super.onAttachedToWindow();
    String currentTab = getCurrentTabTag();
    // Go through all tabs and make sure their fragments match.
    // the correct state.
    FragmentTransaction ft = null;
    for (int i=0; i<mTabs.size(); i++) {
        TabInfo tab = mTabs.get(i);
        tab.fragment = mFragmentManager.findFragmentByTag(tab.tag);
        if (tab.fragment != null && !tab.fragment.isDetached()) {
            if (tab.tag.equals(currentTab)) {
                // The fragment for this tab is already there and
                // active, and it is what we really want to have
                // as the current tab.  Nothing to do.
                mLastTab = tab;
            } else {
                // This fragment was restored in the active state,
                // but is not the current tab.  Deactivate it.
                if (ft == null) {
                    ft = mFragmentManager.beginTransaction();
                }
                ft.detach(tab.fragment);
            }

        }
    }
    // We are now ready to go.  Make sure we are switched to the
    // correct tab.
    mAttached = true;
    ft = doTabChanged(currentTab, ft);
    if (ft != null) {
        ft.commit();
        mFragmentManager.executePendingTransactions();
    }
}
@Override
protected void  onDetachedFromWindow() {
    super.onDetachedFromWindow();
    mAttached = false;
}

如您所见,mFragmentManager.executePendingTransactions();已在onAttachedToWindow处执行。

  

或者是否可以“自己创建标签”并将它们添加到   TabHost?

是的,您可以使用tabhost,然后可以使用以下方法创建标签内容。

public TabHost.TabSpec setContent (int viewId)

public TabHost.TabSpec setContent (Intent intent)

public TabHost.TabSpec setContent (TabHost.TabContentFactory contentFactory)