1

基本的に私の質問はちょっと「簡単」です:
私はこのタブレットのレイアウトを横向きにしています:

タブレット レイアウト ランドスケープ

ユーザーがタブレットを縦向きモードに回転させた場合、レイアウトを次のレイアウトに変更します。

タブレット レイアウト縦

最初の横向きのレイアウトでは、UiFragment1が左右に2 つのフラグメントを同時に表示Fragment2します。のコンテナFragment2は でViewPager、これには も含まれていますFragment3Fragment3ユーザーがスワイプして表示されるか、 のタブをクリックしますActionBar

2 番目の縦向きのレイアウトでは、Ui に 3 つすべてFragmentの が一度にViewPager表示されます。タブも不要なので削除されます。

MainActivity で横向きのレイアウトを次のように作成します。

    // ActionBar Stuff
    mActionbar = getSupportActionBar();
    mActionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    mActionbar.setHomeButtonEnabled(false);

    // Swipe Stuff
    mAdapter = new FragmentAdapter(fm);
    mPager = (ViewPager) findViewById(R.id.viewpager);
    mPager.setAdapter(mAdapter);
    mPager.setOnPageChangeListener(this);

    // Initialize Tabs
    Tab1 = mActionbar.newTab().setText("Tab1");
    Tab2 = mActionbar.newTab().setText("Tab2");

    // Set Tab to Fragment // they're initialized here and accessed in the ViewPager (mPager)
    Fragment1 = new FirstFragment();
    Fragment3 = new ThirdFragment();

    android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.fragment_one_container, Fragment1).commit();

    // //TabListener///////////////////////////
    Tab1.setTabListener(new TabsListener(mApp, 0 + "", mPager));
    Tab2.setTabListener(new TabsListener(mApp, 1 + "", mPager));

    // //Add Tabs//////////////////////////////
    mActionbar.addTab(Tab1);
    mActionbar.addTab(Tab2);

スワイプ時のこれら 2 つの Fragment 間の切り替えと、実行時の (ナビゲーション用の)他の とのViewPager置換など、いくつかのより複雑なことへの切り替え。Fragment2Fragment

これまでのところ、すべて問題ありません。ポートレート レイアウトのコードは似ています。

    // ActionBar Stuff
    mActionbar = getSupportActionBar();
    mActionbar.setHomeButtonEnabled(false);

    // Swipe Stuff
    mAdapter = new FragmentAdapter(fm);
    mPager = (ViewPager) findViewById(R.id.viewpager);
    mPager.setAdapter(mAdapter);
    mPager.setOnPageChangeListener(this);

    // Set Tab to Fragment // they're initialized here and accessed in the ViewPager (mPager)
    Fragment1 = new FirstFragment();
    Fragment3 = new ThirdFragment();

    android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.fragment_one_container, Fragment1);
    ft.replace(R.id.fragment_three_container, Fragment3);
    ft.commit();

ViewPager は のコンテナですFragment2。他のコンテナは上記のコードで説明されています。

レイアウト ファイルR.layout.main_tablet_landR.layout.main_tablet_portは、layout-lard-landとにありlayout-large-portます。

私の実際の問題は表示ではありません。これは機能します。私の問題は向きの変更です。次の例外が発生します。java.lang.IllegalStateException: Can't change container ID of fragment Fragment3

私はオーバーライドして、レイアウトを再適用し、レイアウト(コードの最初のブロック) と(2 番目のブロック)のメソッドを呼び出そonConfiguratioChangeうとしました。(などなど ..)setContentView(layout)tablet_landtablet_port

これを回避する方法はありますか?

編集:アイデアはありませんか?

4

1 に答える 1

1

2 パネル レイアウトで fragment3 のコンテナがない場合は、fragment3 をクリアするコードを追加する必要があります。

したがって、XXX_FragmentActivity onCreate メソッドを次のように書き直してみてください。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_activity);
    // fragment 3 trick
    FragmentManager fm = getSupportFragmentManager();
    Fragment oldFragment3 = fm.findFragmentById(R.id.fragment_three_container);
    View fragment3Container = findViewById(R.id.fragment_three_container);
    if(null==fragment3Container && null!=oldFragment3){
        FragmentTransaction ft = fm.beginTransaction();
        ft.remove(oldFragment3);
        ft.commit();
        fm.executePendingTransactions();
    }
    // other stuff
}
于 2013-02-19T17:17:38.323 に答える