2

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

现在,我需要在另一个片段之前创建2 个可滑动片段(例如,片段 1 和 2 的 onCreateView 方法应该在片段 3 的 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

谁能告诉我如何完成我正在尝试做的事情,或者建议我可以尝试的事情?我还应该提到,重构使得片段依赖动作从它们的构造函数中执行不是一种选择。

4

1 回答 1

2

正如我的问题下面的评论中所指出的,我决定重构我的代码以删除片段之间的依赖关系是最好的方法。我不能/不应该依赖引擎盖下发生的事情(即 Android 片段实例化/创建顺序)让我的代码也按我的预期运行。

于 2013-01-30T18:26:19.630 回答