如何获取Android FragmentPagerAdapter的片段引用

时间:2013-01-29 22:47:00

标签: android android-fragments android-activity fragmentpageradapter

我正在使用带有FragmentPagerAdapter的ViewPager来允许在两个片段之间滑动。我没有使用FragmentStatePagerAdapter,因为它在它们之间滑动时会破坏并重新创建新的片段实例,并且我不希望其中一个片段中的操作执行多次)。我需要一种方法来获取对2个创建的片段的引用以传递给FragmentPagerAdapter,但以下代码产生错误(见下文):

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

有人可以帮我吗?

修改
我也尝试了以下内容,但它将每个片段实例化两次(可以理解),这是我不想要的。除此之外,它适用于此代码:

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);
}

1 个答案:

答案 0 :(得分:1)

这是我用来构建viewpager布局的very clear tutorial with sample code

正如@harmanjd似乎建议的那样,你不要将片段放在带有viewpager布局的XML文件中。在其自己的XML和/或Java类中定义每个,实例化上面的那些(使用fragments.add(Fragment.instantiate(this, CustomFragment.class.getName()))作为自定义类),将它们放在pagerAdapter中并将其提供给ViewPager

ViewPager XML应该看起来像这样(除非它是片段之外的更大布局的一部分):

<?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>