4

タブのコンテンツがフラグメントによって定義されているフラグメントに含まれるタブホストを使用しようとしています。じゃあオーケー、

GoogleのFragmentsTabの例から始めました。これは、フラグメントをタブ コンテンツとして使用する方法を示していますが、TabHostそれ自体はまだアクティビティでホストされています。繰り返しますが、タブ ホストをフラグメントでホストする必要があります。

例をFragmentsTab挙げて、コードを にonCreate()移動し、 に移動しonCreateView()ましたFragment

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View fragmentView = inflater.inflate(R.layout.detail_fragment, container);

    mTabHost = (TabHost) fragmentView.findViewById(android.R.id.tabhost);
    mTabHost.setup();

    mTabManager = new TabManager(getActivity(), mTabHost, R.id.realtabcontent);

    // TODO: localize
    mTabManager.addTab(mTabHost.newTabSpec("info").setIndicator("File Info"), InfoFragment.class, null);

    return fragmentView;
}

実行すると、この例外が発生します。

05-25 14:42:27.272: E/AndroidRuntime(4701): Caused by: java.lang.IllegalStateException: Recursive entry to executePendingTransactions
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1343)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:429)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at com.zimbra.octopus.android.TabManager.onTabChanged(TabManager.java:116)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.widget.TabHost.invokeOnTabChangeListener(TabHost.java:359)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.widget.TabHost.setCurrentTab(TabHost.java:344)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.widget.TabHost.addTab(TabHost.java:216)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at com.zimbra.octopus.android.TabManager.addTab(TabManager.java:92)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at com.zimbra.octopus.android.DetailFragment.onCreateView(DetailFragment.java:46)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:819)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1053)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1371)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:429)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at com.zimbra.octopus.android.TabManager.onTabChanged(TabManager.java:116)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.widget.TabHost.invokeOnTabChangeListener(TabHost.java:359)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.widget.TabHost.setCurrentTab(TabHost.java:344)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.widget.TabHost.addTab(TabHost.java:216)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at com.zimbra.octopus.android.TabManager.addTab(TabManager.java:92)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at com.zimbra.octopus.android.DetailFragment.onCreateView(DetailFragment.java:46)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:819)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1032)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1111)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:264)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)

トレースを見ると、onCreateView()for DetailFragment(をホストしているフラグメントTabHost) 呼び出しが再帰的に行われていることがわかります。どういうわけか、への呼び出しTabManager.addTab()(FragmentsTab の例を再度参照) は、への再帰呼び出しになりDetailFragment.onCreateView()ます。

私は何を間違っていますか?これは可能ですか?

4

2 に答える 2

2

Android では、あるフラグメントを他のフラグメント内に埋め込むことはできません。logcat は、あるフラグメント トランザクションを別のフラグメント内で実行していることを示しています (つまり、executePendingTransactions への再帰エントリ)。許可されていません、ごめんなさい!

于 2012-05-25T22:02:03.003 に答える
0

TabHost をセットアップする前にこれを追加します。

LocalActivityManager mLocalActivityManager = new LocalActivityManager(getActivity(), false);
mLocalActivityManager.dispatchCreate(savedInstanceState);
mTabHost.setup(mLocalActivityManager);
于 2012-06-12T15:14:55.240 に答える