15

複数のタブを持つ FragmentTabHost を使用しています (ここに示すように構築されています)。ただし、タブを少なくとも 1 回クリックしてアドレス指定されたタブがアクティブ化されていない限り、getFragmentByTag (その場合は null を返します) を使用してタブをランダムにアドレス指定することはできません。

FragmentTabHost は、タブが本当に必要になるまでタブの作成を遅らせるようです (つまり、ユーザーがタブをクリックして表示したい場合)。
getFragmentByTag で安全にアクセスできるように、ホストに強制的にそれらをすぐに作成させる方法はありますか?
または、「自分で」タブを作成し、それらを TabHost に追加することは可能ですか?

4

1 に答える 1

5

getFragmentByTag で安全にアクセスできるように、ホストに強制的にそれらをすぐに作成させる方法はありますか?

いいえ。トランザクションは で実行されるためonAttachedToWindow()です。ソースコードを見てみましょう:

@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 インテント)

public TabHost.TabSpec setContent (TabHost.TabContentFactory contentFactory)

于 2015-04-16T12:17:34.063 に答える