1

基本上我的問題是有點「易」:
我在景觀這款平板佈局:平板電腦佈局,改變取決於屏幕方向錯誤

Tablet Layout Landscape

並希望改變佈局,如果用戶旋轉平板電腦進入人像模式,這種佈局:

Tablet Layout Portrait

在第一個景觀中,Ui顯示一次顯示兩個片段,左側爲Fragment1,右側爲Fragment2Fragment2的容器是ViewPager,其中還包含Fragment3。用戶可以看到Fragment3,或點擊ActionBar中的選項卡。

在第二個人像,佈局的Ui顯示全部三個Fragment s,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); 

在刷卡和一些更復雜的東西這兩個片段之間的ViewPager開關,像在運行時與其他Fragment小號取代Fragment2(用於導航)。

到目前爲止,一切都很好,我對縱向佈局的代碼是相似的:

// 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_portlayout-lard-landlayout-large-port中。

我實際的問題是不顯示,這個工作,我的問題是方向變化,我得到這個異常:java.lang.IllegalStateException: Can't change container ID of fragment Fragment3

我推翻onConfiguratioChange並試圖setContentView(layout)重新應用佈局和調用該方法的佈局(第一個代碼塊)和tablet_port(第二個塊)。 (還有更多..)

任何想法如何避免這種情況?

編輯:沒有想法?

回答

1

你必須添加一些代碼來清除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 
}