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 に答える