控制android片段创建顺序

时间:2013-01-30 15:21:13

标签: android android-fragments android-activity fragmentpageradapter

所以,我在FragmentActivity中有3个片段。我有一个带有一些容器等的xml布局文件,所以我setContentView(R.layout.my_activity)然后以编程方式添加3个片段。其中2个片段与FragmentPagerAdapter一起使用,因此我可以在它们之间滑动。

现在,我需要在另一个片段之前创建 2个可刷卡的片段(例如片段1和2的 onCreateView 方法应该在<片段3)的em> onCreateView 方法。但是,始终首先创建片段3。代码:

public class MyActivity extends FragmentActivity {

private ViewPager viewPager;
private MyPagerAdapter pagerAdapter;
private Fragment1 fragment1;
private Fragment2 fragment2;
private Fragment3 fragment3;

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

private void initViewPager() {
    List<Fragment> pagerFragments = new LinkedList<Fragment>();
    fragment1 = (Fragment1) Fragment.instantiate(this, Fragment1.class.getName());
    fragment2 = (Fragment2) Fragment.instantiate(this, Fragment2.class.getName());
    pagerFragments.add(fragment1);
    pagerFragments.add(fragment2);
    pagerAdapter = new MyPagerAdapter(getSupportFragmentManager(), pagerFragments);
    viewPager = (ViewPager) findViewById(R.id.fragment_pager);
    viewPager.setAdapter(pagerAdapter);
}

private void initStatsFragment() {
    fragment3 = new Fragment3();
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.add(R.id.fragment3_container, fragment3);
    transaction.commit();
}
    ...

我还尝试使用 initViewPager 方法替换上面的代码:

...
...
private void initViewPager() {
    List<Fragment> pagerFragments = new LinkedList<Fragment>();
    fragment1 = new Fragment1();
    fragment2 = new Fragment2();
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.add(R.id.swipe_fragment_container, fragment1);
    transaction.add(R.id.swipe_fragment_container, fragment2);
    transaction.commit();
    pagerFragments.add(fragment1);
    pagerFragments.add(fragment2);
    pagerAdapter = new MyPagerAdapter(getSupportFragmentManager(), pagerFragments);
    viewPager = (ViewPager) findViewById(R.id.fragment_pager);
    viewPager.setAdapter(pagerAdapter);
}
    ...
    ...

但这会产生错误并在启动时崩溃 ,类似于以下内容:

01-30 15:05:06.250: E/AndroidRuntime(2772): java.lang.IllegalStateException: Can't change container ID of fragment Fragment1{416461c8 #1 id=0x7f0b0003 android:switcher:2131427332:0}: was 2131427331 now 2131427332

任何人都可以告诉我如何实现我正在尝试做的事情,或建议我可以尝试的事情吗?我还应该提一下,重新分解这样的片段依赖性操作是从它们的构造函数中执行的,这不是一种选择。

1 个答案:

答案 0 :(得分:2)

正如我的问题下面的评论所示,我决定重新分解我的代码以删除片段之间的依赖关系是最好的方法。我不能/不应该依赖于引擎盖下的内容(即Android片段实例化/创建顺序),以便我的代码能够按照我的预期运行。