我正在使用带有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);
}
答案 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>