2

我正在使用带有 FragmentPagerAdapter 的 ViewPager 以允许在 2 个片段之间滑动。我没有使用 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);
}
4

1 回答 1

1

这是一个非常清晰的教程,其中包含我用来构建 viewpager 布局的示例代码。

正如@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>
于 2013-01-29T23:09:02.567 回答