3

ここに示すように、ActionBar タブと組み合わせて ViewPager を使用しています。下位互換性のために ActionBarSherlock を使用しているため、親アクティビティは SherlockFragmentActivity を拡張し、子フラグメントは SherlockFragment を拡張します。

このソリューションは、スワイプのあるタブではうまく機能しますが、タブの 1 つに関連付けられているフラグメントを動的に変更したいと考えています。

この件に関する多数のSOの回答を読みましたが(たとえば、ここここ)、ViewPager +上記のTabsAdapterを使用するときにフラグメントを動的に変更する方法の明確な説明が見つかりませんでした。

これが私が今持っているものです。ユーザーが既存のフラグメントのボタンを押すと、次のように親アクティビティのフラグメントを置き換えようとします。

AnotherFragment fragment = new AnotherFragment();           
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();

int viewId = R.id.pager;                 // resource id of the ViewPager
int position = Constants.TAB_2;          // tab pos of the fragment to be changed

String tag = "android:switcher:" + viewId + ":" + position;

ft.replace(viewId, fragment, tag);
ft.commit();

mTabsAdapter.notifyDataSetChanged();

これはうまくいかないので、何かが欠けています。getChildFragmentManager() を使用してネストされたフラグメントでも実行しようとしましたが、この関数は API 17、Android 4.2 なしでは使用できないため、問題が発生しました。

助けてくれてありがとう!

4

1 に答える 1

1

同様の動作を示す小さな例を作成しました。再利用していただけると幸いです。

重要なのは、フラグメントをコンテナーとして使用し、それを使用して「実際の」フラグメントを置き換えることだと思います。

たとえば、別のフラグメントに移動する方法を参照してください。

        btn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            FragmentTransaction trans = getFragmentManager()
                    .beginTransaction();
            /*
             * IMPORTANT: We use the "root frame" defined in
             * "root_fragment.xml" as the reference to replace fragment
             */
            trans.replace(R.id.root_frame, new SecondFragment());

            /*
             * IMPORTANT: The following lines allow us to add the fragment
             * to the stack and return to it later, by pressing back
             */
            trans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
            trans.addToBackStack(null);

            trans.commit();
        }
    });

ここで例全体を確認できます。

https://github.com/danilao/fragments-viewpager-example

于 2014-01-30T10:09:02.703 に答える