5

フラグメントの 1 つのレイアウトに FragmentTabHost があります (parentFragment と呼びましょう)。ここで、parentFragment の onCreateView で、タブホストに入る各フラグメントをプログラムで初期化します。parentFragment が作成されると、すべてが正常に機能しているように見え、最初のタブのフラグメントが正しく表示されます。

しかし、一度タブを切り替えるとすぐに、フラグメントは消えます (タブホストの背景色は見えますが、tabcontent-container のコンテンツは見えません)。また、最初のフラグメントに戻ると、最初のフラグメントがなくなります。私のロギングが示すように、フラグメントは実際に作成されていますが、表示されません。

FragmentPagerAdapterでViewPagerも使用しようとしたため、フラグメントの(再)作成に関係していると思います。最初の 2 つのフラグメント (setOffscreenPageLimit() ==1 によりプリロードされた) をうまく切り替えることができましたが、それ以降に (再) 作成されたフラグメントも空白でした。

誰か考えはありますか??

これが私のコードの一部です:

親フラグメントの XML の抽出:

...
            <android.support.v4.app.FragmentTabHost
                android:id="@android:id/tabhost"
                android:layout_width="match_parent"
                android:layout_height="match_parent" >

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" >

                    <TabWidget
                        android:id="@android:id/tabs"
                        android:layout_width="match_parent"
                        android:layout_height="40dp"
                        android:layout_alignParentTop="true" />

                    <FrameLayout
                        android:id="@android:id/tabcontent"
                        android:layout_width="0dp"
                        android:layout_height="0dp" />

                    <FrameLayout
                        android:id="@+id/realtabcontent"
                        android:layout_below="@android:id/tabs"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent" />
                </RelativeLayout>
            </android.support.v4.app.FragmentTabHost>
...

親フラグメントの XML の抽出:

...
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d(TAG, "onCreateView");
        ViewGroup layoutContainer = (ViewGroup) inflater.inflate(R.layout.fragment_app_details_test, container, false);

            tabHost = (FragmentTabHost) layoutContainer.findViewById(android.R.id.tabhost);
        tabHost.setup(getActivity(), getChildFragmentManager(), R.id.realtabcontent);
        tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("TAB1"),
                FragmentSubTab1.class, null);
        tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("TAB2"),
                FragmentSubTab2.class, null);
        tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("TAB3"),
                FragmentSubTab3.class, null);

        return layoutContainer;
    }
...

サブタブのフラグメントでの単純なレイアウト インフレーション:

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

        initUi(layoutContainer);
        return layoutContainer;
    }
...
4

1 に答える 1

1

以前 FragmentTabHost を扱ったことはありませんが、アクション バー メソッド setNavigationMode(ActionBar.NAVIGATION_MODE_TABS) を使用して、アプリでタブ ナビゲーションを実現することをお勧めします (ドキュメントはこちら: http://developer.android.com/guide/topics /ui/actionbar.html#Tabs ) この提案された方法は、手間がかからず、使用するフラグメント ホルダーも少ないようです。基本的に、タブをインスタンス化し、それらをバックスタックに追加し、onTabSelected または onTabUnselected メソッドを介して、選択したタブに従って表示/非表示にします。

それが役に立てば幸い。

于 2012-12-18T21:02:07.217 に答える