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
}