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 
}