基本的に私の質問はちょっと「簡単」です:
私はこのタブレットのレイアウトを横向きにしています:
ユーザーがタブレットを縦向きモードに回転させた場合、レイアウトを次のレイアウトに変更します。
最初の横向きのレイアウトでは、UiFragment1
が左右に2 つのフラグメントを同時に表示Fragment2
します。のコンテナFragment2
は でViewPager
、これには も含まれていますFragment3
。Fragment3
ユーザーがスワイプして表示されるか、 のタブをクリックします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
置換など、いくつかのより複雑なことへの切り替え。Fragment2
Fragment
これまでのところ、すべて問題ありません。ポートレート レイアウトのコードは似ています。
// 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_land
とR.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_land
tablet_port
これを回避する方法はありますか?
編集:アイデアはありませんか?