Android 平板电脑布局,根据屏幕方向错误而变化

Android 平板电脑布局,根据屏幕方向错误而变化,android,layout,android-fragments,actionbarsherlock,fragment,Android,Layout,Android Fragments,Actionbarsherlock,Fragment,基本上我的问题有点“简单”: 我的平板电脑布局是横向的: 如果用户将平板电脑旋转到纵向模式,则要更改布局: 在第一个横向布局中,Ui同时显示两个片段,Fragment1位于左侧,而Fragment2位于右侧。Fragment2的容器是一个ViewPager,它还包含Fragment3碎片3可见,用户可以滑动到碎片3,或者单击操作栏中的选项卡 在第二个纵向布局中,Ui一次显示所有三个片段s,移除ViewPager,也移除选项卡,因为它们是不必要的 我在主要活动中创建了如下景观布局: /

基本上我的问题有点“简单”:
我的平板电脑布局是横向的:

如果用户将平板电脑旋转到纵向模式,则要更改布局:

在第一个横向布局中,Ui同时显示两个片段,
Fragment1
位于左侧,而
Fragment2
位于右侧。
Fragment2
的容器是一个
ViewPager
,它还包含
Fragment3
<代码>碎片3可见,用户可以滑动到碎片3,或者单击
操作栏中的选项卡

在第二个纵向布局中,Ui一次显示所有三个
片段
s,移除
ViewPager
,也移除选项卡,因为它们是不必要的

我在主要活动中创建了如下景观布局:

    // 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
在滑动时在这两个片段之间切换,并切换到一些更复杂的事情,例如在运行时用其他
片段替换
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是碎片2的容器,其他容器在上面的代码中进行了解释

布局文件
R.Layout.main\u tablet\u land
R.Layout.main\u tablet\u port
位于
Layout lard land
Layout larg port

我的实际问题不是显示,这是可行的,我的问题是方向改变,我得到了这个异常:
java.lang.IllegalStateException:Can't change container ID of Fragment3

我覆盖了配置更改的
onconfigurationchange
,并尝试使用
setContentView(layout)
重新应用布局,并调用布局
tablet\u land
(第一个代码块)和
tablet\u port
(第二个代码块)的方法。(还有更多……)

有没有办法避免这种情况


编辑:没有想法?

如果双面板布局中没有容器,则必须添加一些代码以清除碎片3:

因此,尝试在创建方法上重写XXX\U FragmentActivity,如下所示:

@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
}

如果双面板布局中没有容器,则必须添加一些代码以清除碎片3:

因此,尝试在创建方法上重写XXX\U FragmentActivity,如下所示:

@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
}