2

FragmentPagerAdapter で ViewPager を使用して、2 つのフラグメント間でスワイプできるようにしています。私は FragmentStatePagerAdapter を使用していません。なぜなら、それらの間をスワイプするときに新しいフラグメントインスタンスを破棄して再作成し、フラグメントの 1 つで操作を複数回実行したくないからです)。FragmentPagerAdapter に渡す 2 つの作成されたフラグメントへの参照を取得する方法が必要ですが、次のコードはエラーを生成しています (以下を参照)。

public class MyActivity extends FragmentActivity {

    private ViewPager viewPager;
    private MyPagerAdapter pagerAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_layout);
        initViewPager();
    }

    private void initViewPager() {
        List<Fragment> fragments = new ArrayList<Fragment>();
        FragmentManager fragManager = getSupportFragmentManager();
        fragments.add(fragManager.findFragmentById(R.id.fragment_1));
        fragments.add(fragManager.findFragmentById(R.id.fragment_2));
        pagerAdapter = new MyPagerAdapter(fragManager, fragments);
        viewPager = (ViewPager) findViewById(R.id.fragment_pager);
        viewPager.setAdapter(pagerAdapter);
    }
    ...
    ...
    private class MyPagerAdapter extends FragmentPagerAdapter {

        private List<Fragment> fragments;

        public MyPagerAdapter(FragmentManager fragmentManager, List<Fragment> fragments) {
                super(fragmentManager);
                this.fragments = fragments;
        }

        @Override
        public Fragment getItem(int position) {
            return fragments.get(position);
        }
        ...
        ...

これにより、次のエラー (または同様のエラー) が生成されます。

java.lang.IllegalStateException: Can't change container ID of fragment Fragment1{4169f780 #1 id=0x7f0b0005 android:switcher:2131427331:0}: was 2131427333 now 2131427331

誰でもこれで私を助けることができますか?

編集
次のことも試しましたが、各フラグメントを正確に 2 回 (当然のことながら) インスタンス化しますが、これは望ましくありません。それ以外は、次のコードで動作します。

private void initViewPager() {

    List<Fragment> fragments = new Vector<Fragment>();
    fragments.add(Fragment.instantiate(this, Fragment1.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment2.class.getName()));
    pagerAdapter = new MyPagerAdapter(getSupportFragmentManager(), fragments);
    viewPager = (ViewPager) findViewById(R.id.fragment_pager);
    viewPager.setAdapter(pagerAdapter);
}
4

1 に答える 1

1

これは、ビューページャーのレイアウトを作成するために使用したサンプルコードを含む非常に明確なチュートリアルです。

@harmanjdが示唆しているように、ビューページャーレイアウトを使用してフラグメントをXMLファイルに配置しないでください。それぞれを独自のXMLおよび/またはJavaクラスで定義し、上記のようにインスタンス化fragments.add(Fragment.instantiate(this, CustomFragment.class.getName()))して(カスタムクラスに使用)、それらを入れて、pagerAdapterに渡しViewPagerます。

ViewPagerXMLは次のようになります(フラグメント以外のより大きなレイアウトの一部でない限り):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<ViewPager
    android:id="@+android:id/viewpager"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

</LinearLayout>
于 2013-01-29T23:09:02.567 に答える